Install necessary packages

install.packages("summarytools")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/summarytools_0.9.8.zip'
Content type 'application/zip' length 914980 bytes (893 KB)
downloaded 893 KB
package ‘summarytools’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\yoges\AppData\Local\Temp\RtmpMv2rvd\downloaded_packages
library(DT)
library(readr)
library(ggplot2)
library(knitr)
library(hms)
library(kableExtra)
library(dplyr)
library(magrittr)
library(gridExtra)

library(plotly)
library(Hmisc)
library(ggthemes)
library(tidyr)
library(sysfonts)
font_add_google(name = "Amatic SC", family = "amatic-sc")

library(sf)
library(rnaturalearth)
library(rnaturalearthdata)
library(summarytools)

Import datasets

vaccinations = read_csv("country_vaccinations.csv")
world_population = read_csv("world_population_by_countries.csv")

Dataset Preview

datatable(vaccinations, options = list(
  searching = FALSE,
  pageLength = 10,
  lengthMenu = c(10, 10, 15, 20)
))
datatable(world_population, options = list(
  searching = FALSE,
  pageLength = 10,
  lengthMenu = c(10, 10, 15, 20)
))

Descriptive Stats

describe(vaccinations, descript = "Life Expectancy") %>% html()
Life Expectancy

15 Variables 4908 Observations

country
nmissingdistinct
49080122
lowest愼㸰:Albania Algeria Andorra Anguilla Argentina
highest:United StatesUruguay Venezuela Wales Zimbabwe

iso_code
nmissingdistinct
4592316118
lowest愼㸰: AIA ALB AND ARE ARG , highest: URY USA VEN ZAF ZWE
date
image
          n    missing   distinct       Info       Mean        Gmd        .05 
       4908          0         85          1 2021-01-31      21.73 2020-12-29 
        .10        .25        .50        .75        .90        .95 
 2021-01-04 2021-01-17 2021-02-03 2021-02-16 2021-02-24 2021-02-27 
 
lowest愼㸰:2020-12-082020-12-092020-12-102020-12-112020-12-12
highest:2021-02-262021-02-272021-02-282021-03-012021-03-02

total_vaccinations
image
        n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
     3193     1715     3053        1  1794351  3023396     1511     6830    32133 
      .50      .75      .90      .95 
   212940   914303  3847174  7627234 
 
lowest愼㸰: 0 1 5 12 13 , highest: 70454064 72806180 75236003 76899987 78631601
people_vaccinated
image
        n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
     2718     2190     2611        1  1546290  2594905     2166     8226    29344 
      .50      .75      .90      .95 
   196111   839216  3224232  6856934 
 
lowest愼㸰: 0 1 5 13 18 , highest: 47184199 48435536 49772180 50732997 51755447
people_fully_vaccinated
image
        n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
     1845     3063     1754        1   529155   893062     1328     3328    12600 
      .50      .75      .90      .95 
    57835   299518  1094752  1843910 
 
lowest愼㸰: 1 2 5 8 12 , highest: 22613359 23698627 24779920 25466405 26162122
daily_vaccinations_raw
image
        n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
     2694     2214     2500        1    74533   120183    104.7    578.6   2382.5 
      .50      .75      .90      .95 
  11975.0  50589.8 172086.8 331940.7 
 
lowest愼㸰: -50012 0 1 2 3 , highest: 2218752 2231326 2242472 2352116 2429823
daily_vaccinations
image
nmissingdistinctInfoMeanGmd.05.10.25.50.75.90.95
4748160357615711396274 126 275 1128 5902 27571120024288104
lowest愼㸰: 1 2 3 4 9 , highest: 1738321 1795238 1817502 1916190 1942788
total_vaccinations_per_hundred
image
nmissingdistinctInfoMeanGmd.05.10.25.50.75.90.95
31931715130317.36510.3 0.016 0.090 0.600 2.820 7.07019.50429.772
lowest愼㸰: 0.00 0.01 0.02 0.03 0.04 , highest: 99.05 102.70 106.53 109.25 112.96
people_vaccinated_per_hundred
image
nmissingdistinctInfoMeanGmd.05.10.25.50.75.90.95
27182190108915.9718.049 0.02 0.10 0.64 2.60 5.5516.8627.29
lowest愼㸰: 0.00 0.01 0.02 0.03 0.04 , highest: 60.68 64.09 67.41 69.80 72.28
people_fully_vaccinated_per_hundred
image
nmissingdistinctInfoMeanGmd.05.10.25.50.75.90.95
1845306347512.3863.4490.0200.0400.2400.8802.0803.1968.418
lowest愼㸰: 0.00 0.01 0.02 0.03 0.04 , highest: 39.13 39.45 39.81 40.48 40.68
daily_vaccinations_per_million
image
        n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
     4748      160     2503        1     2462     3287    30.35    77.00   325.00 
      .50      .75      .90      .95 
  1056.00  2290.50  6233.90  9450.70 
 
lowest愼㸰: 0 1 2 3 4 , highest: 31700 35027 41344 47947 54264
vaccines
image
nmissingdistinct
4908024
lowest愼㸰:Covaxin, Oxford/AstraZeneca EpiVacCorona, Sputnik V Johnson&Johnson Moderna Moderna, Oxford/AstraZeneca, Pfizer/BioNTech
highest:Pfizer/BioNTech, Sinovac Sinopharm/Beijing Sinopharm/Beijing, Sinopharm/Wuhan, Sinovac Sinovac Sputnik V

source_name
image
nmissingdistinct
4908074
lowest愼㸰:Cayman Islands Government Centers for Disease Control and Prevention COVID-19 Malta Public Health Response Team COVID-19 Vaccine Information Platform Department of Statistics and Health Information
highest:Saudi Health Council Sciensano Secretary of Health Social Security Institute Statens Serum Institut

source_website
nmissingdistinct
49080118
lowest愼㸰:http://covid19.ncema.gov.ae/en http://datos.salud.gob.ar/dataset/vacunas-contra-covid-19-dosis-aplicadas-en-la-republica-argentina http://english.ahram.org.eg/NewsContent/1/64/399964/Egypt/Politics-/,-medical-staff-vaccinated-against-COVID-in-first-.aspx http://mohfw.gov.in/pdf/CumulativeCOVIDVaccinationCoverageReport2March2021.pdf http://ncv.kdca.go.kr/
highest:https://www.reuters.com/article/us-health-coronavirus-venezuela-vaccine/venezuela-inoculates-health-workers-in-caracas-hospital-idUSKBN2AM2FR https://www.rnz.co.nz/news/national/437432/covid-19-vaccinations-at-port-of-tauranga-begin https://www.rts.rs/page/stories/sr/%D0%9A%D0%BE%D1%80%D0%BE%D0%BD%D0%B0%D0%B2%D0%B8%D1%80%D1%83%D1%81/story/3134/koronavirus-u-srbiji/4279039/korona-srbija-podaci-zarazeni#shortStory-122262https://www.sainthelena.gov.sh/2021/news/covid-19-vaccination-programme-update/ https://www.terviseamet.ee/et/uudised/covid-19-blogi-2-marts-oopaevaga-lisandus-1113-positiivset-testi

Countrywise Plots

Plot – Vaccines per day | Percentage of vaccined population | Daily Vaccinations

Argentina - AR

argentina <- vaccinations[grep("ARG", vaccinations$iso_code),]
argentina_world_pop <- world_population[grep("Argentina", world_population$Country),]


argentina$population = argentina_world_pop$Population
argentina$percentage = (argentina$people_vaccinated/argentina$population)*100

plot_argentina <- argentina %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇷") +
    scale_y_continuous(breaks = seq(0, 100000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_argentina_1 = plot_argentina
plot_argentina_1 = plot_argentina_1 + ggtitle("Population Vaccinated on \n Argentina (2021)") + 
    theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))

plot_argentina_percentage <- argentina %>%
  ggplot( aes(x=date, y=percentage, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_argentina_2 = plot_argentina_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_argentina_2 = plot_argentina_2 + ggtitle("Population (%) Vaccinated \n on Argentina") + 
    theme(plot.title = element_text(size = 7, face = "bold"))


plot_argentina_daily_vac <- argentina %>%
  ggplot( aes(x=date, y=daily_vaccinations)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇷") +
    scale_y_continuous(breaks = seq(0, 100000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    

plot_argentina_interactive <- plot_ly(x = argentina$date, y = argentina$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")
plot_argentina_interactive2 <- plot_ly(x = argentina$date, y = argentina$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_argentina_interactive3 <- plot_ly(x = argentina$date, y = argentina$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")


plotly::subplot(plot_argentina_interactive,plot_argentina_interactive2,plot_argentina_interactive3, nrows=1 , margin= 0.05)

Austria - AT

austria <- vaccinations[grep("AUT", vaccinations$iso_code),]
austria_world_pop <- world_population[grep("Austria", world_population$Country),]

austria$population = austria_world_pop$Population
austria$percentage = (austria$people_vaccinated/austria$population)*100

plot_austria <- austria %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇹") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_austria_1 = plot_austria+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_austria_1 = plot_austria_1 + ggtitle("Population Vaccinated on \n Austria (2021)")

plot_austria_percentage <- austria %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇹") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_austria_2 = plot_austria_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_austria_2 = plot_austria_2 + ggtitle("Population (%) Vaccinated \n on Austria") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_austria_interactive <- plot_ly(x = austria$date, y = austria$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")
plot_austria_interactive2 <- plot_ly(x = austria$date, y = austria$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_austria_interactive3 <- plot_ly(x = austria$date, y = austria$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_austria_interactive,plot_austria_interactive2,plot_austria_interactive3, nrows=1 , margin= 0.05)

Bahrain - BH

bahrain <- vaccinations[grep("BHR", vaccinations$iso_code),]
bahrain_world_pop <- world_population[grep("Bahrain", world_population$Country),]

bahrain$population = bahrain_world_pop$Population
bahrain$percentage = (bahrain$people_vaccinated/bahrain$population)*100


bahrain$percentage[is.na(bahrain$percentage)] <- round(mean(bahrain$percentage, na.rm = TRUE))

plot_bahrain <- bahrain %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇭") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_bahrain_1 = plot_bahrain+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_bahrain_1 = plot_bahrain_1 + ggtitle("Population (%) \n Vaccinated on \n Bahrain (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_bahrain_percentage <- bahrain %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇭") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_bahrain_2 = plot_bahrain_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_bahrain_2 = plot_bahrain_2 + ggtitle("Population Vaccinated \n on Bahrain") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_bahrain_interactive <- plot_ly(x = bahrain$date, y = bahrain$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")
plot_bahrain_interactive2 <- plot_ly(x = bahrain$date, y = bahrain$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_bahrain_interactive3 <- plot_ly(x = bahrain$date, y = bahrain$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")


plotly::subplot(plot_bahrain_interactive,plot_bahrain_interactive2,plot_bahrain_interactive3, nrows=1 , margin = 0.05)

Belgium - BE

belgium <- vaccinations[grep("BEL", vaccinations$iso_code),]
belgium_world_pop <- world_population[grep("Belgium", world_population$Country),]

belgium$population = belgium_world_pop$Population
belgium$percentage = (belgium$people_vaccinated/belgium$population)*100
plot_belgium <- belgium %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇪") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_belgium_1 = plot_belgium+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_belgium_1 = plot_belgium_1 + ggtitle("Population (%) \n Vaccinated on \n Belgium (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_belgium_percentage <- belgium %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇪") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_belgium_2 = plot_belgium_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_belgium_2 = plot_belgium_2 + ggtitle("Population (%) Vaccinated \n on Belgium") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_belgium_interactive <- plot_ly(x = belgium$date, y = belgium$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_belgium_interactive2 <- plot_ly(x = belgium$date, y = belgium$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_belgium_interactive3 <- plot_ly(x = belgium$date, y = belgium$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_belgium_interactive,plot_belgium_interactive2,plot_belgium_interactive3, nrows=1 , margin = 0.05)

Brazil - BR

brazil <- vaccinations[grep("BRA", vaccinations$iso_code),]
brazil_world_pop <- world_population[grep("Brazil", world_population$Country),]

brazil$population = brazil_world_pop$Population
brazil$percentage = (brazil$people_vaccinated/brazil$population)*100
plot_brazil <- brazil %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇷") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_brazil_1 = plot_brazil+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_brazil_1 = plot_brazil_1 + ggtitle("Population (%) \n Vaccinated on \n Brazil (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_brazil_percentage <- brazil %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_brazil_2 = plot_brazil_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_brazil_2 = plot_brazil_2 + ggtitle("Population (%) Vaccinated \n on Brazil") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_brazil_interactive <- plot_ly(x = brazil$date, y = brazil$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_brazil_interactive2 <- plot_ly(x = brazil$date, y = brazil$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_brazil_interactive3 <- plot_ly(x = brazil$date, y = brazil$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_brazil_interactive,plot_brazil_interactive2,plot_brazil_interactive3, nrows=1 , margin = 0.05)

Bulgaria - BG

bulgaria <- vaccinations[grep("BGR", vaccinations$iso_code),]
bulgaria_world_pop <- world_population[grep("Bulgaria", world_population$Country),]

bulgaria$population = bulgaria_world_pop$Population
bulgaria$percentage = (bulgaria$people_vaccinated/bulgaria$population)*100
plot_bulgaria <- bulgaria %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇬") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_bulgaria_1 = plot_bulgaria+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_bulgaria_1 = plot_bulgaria_1 + ggtitle("Population Vaccinated on  \n Bulgaria (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_bulgaria_percentage <- bulgaria %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇧🇬") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_bulgaria_2 = plot_bulgaria_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_bulgaria_2 = plot_bulgaria_2 + ggtitle("Population (%) Vaccinated \n on Bulgaria") + 
    theme(plot.title = element_text(size = 7, face = "bold"))
    
plot_bulgaria_interactive <- plot_ly(x = bulgaria$date, y = bulgaria$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_bulgaria_interactive2 <- plot_ly(x = bulgaria$date, y = bulgaria$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_bulgaria_interactive3 <- plot_ly(x = bulgaria$date, y = bulgaria$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_bulgaria_interactive,plot_bulgaria_interactive2,plot_bulgaria_interactive3, nrows=1 , margin=0.05)

Canada - CA

canada <- vaccinations[grep("CAN", vaccinations$iso_code),]
canada_world_pop <- world_population[grep("Canada", world_population$Country),]

canada$population = canada_world_pop$Population
canada$percentage = (canada$people_vaccinated/canada$population)*100
plot_canada <- canada %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇦") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_canada_1 = plot_canada+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_canada_1 = plot_canada_1 + ggtitle("Population (%) Vaccinated on Canada (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_canada_percentage <- canada %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇦") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_canada_2 = plot_canada_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_canada_1 = plot_canada_1 + ggtitle("Population Vaccinated \n on Canada") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_canada_interactive <- plot_ly(x = canada$date, y = canada$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_canada_interactive2 <- plot_ly(x = canada$date, y = canada$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_canada_interactive3 <- plot_ly(x = canada$date, y = canada$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_canada_interactive,plot_canada_interactive2,plot_canada_interactive3 ,nrows=1 , margin = 0.05)

Chile - CL

chile <- vaccinations[grep("CHL", vaccinations$iso_code),]
chile_world_pop <- world_population[grep("Chile", world_population$Country),]

chile$population = chile_world_pop$Population
chile$percentage = (chile$people_vaccinated/chile$population)*100
plot_chile<- chile %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇱") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_chile_1 = plot_chile+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_chile_1 = plot_chile_1 + ggtitle("Population Vaccinated on Chile (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_chile_percentage <- chile %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇱") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_chile_2 = plot_chile_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_chile_2 = plot_chile_2 + ggtitle("Population Vaccinated(%) \n  on Chile") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_chile_interactive <- plot_ly(x = chile$date, y = chile$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_chile_interactive2 <- plot_ly(x = chile$date, y = chile$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_chile_interactive3 <- plot_ly(x = chile$date, y = chile$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_chile_interactive,plot_chile_interactive2,plot_chile_interactive3, nrows=1 , margin = 0.05)

China - CN

china <- vaccinations[grep("CHN", vaccinations$iso_code),]
china_world_pop <- world_population[grep("China", world_population$Country),]

china$population = china_world_pop$Population
china$percentage = (china$people_vaccinated/china$population)*100
plot_china <- china %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇳") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_china_1 = plot_china+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_china_1 = plot_china_1 + ggtitle("Population Vaccinated on China (2020/21)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_china_percentage <- china %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇳") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_china_2 = plot_china_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_china_2 = plot_china_2 + ggtitle("Population (%) Vaccinated \n on China") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_china_interactive <- plot_ly(x = china$date, y = china$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_china_interactive2 <- plot_ly(x = china$date, y = china$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_china_interactive3 <- plot_ly(x = china$date, y = china$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_china_interactive,plot_china_interactive2,plot_china_interactive3, nrows=1 , margin = 0.05)

Costa Rica - CR

costa_rica <- vaccinations[grep("CRI", vaccinations$iso_code),]
costa_rica_world_pop <- world_population[grep("Costa Rica", world_population$Country),]

costa_rica$population = costa_rica_world_pop$Population
costa_rica$percentage = (costa_rica$people_vaccinated/costa_rica$population)*100



plot_costa_rica <- costa_rica %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇷") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_costa_rica_1 = plot_costa_rica+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_costa_rica_1 = plot_costa_rica_1 + ggtitle("Population (%) Vaccinated \n on Costa Rica") + 
    theme(plot.title = element_text(size = 6, face = "bold"))

plot_costa_rica_percentage <- costa_rica %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_costa_rica_2 = plot_costa_rica_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_costa_rica_2 = plot_costa_rica_2 + ggtitle("Population (%) Vaccinated \non  Costa Rica") + 
    theme(plot.title = element_text(size = 6, face = "bold"))

plot_costa_rica_interactive <- plot_ly(x = costa_rica$date, y = costa_rica$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_costa_rica_interactive2 <- plot_ly(x = costa_rica$date, y = costa_rica$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_costa_rica_interactive3 <- plot_ly(x = costa_rica$date, y = costa_rica$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_costa_rica_interactive,plot_costa_rica_interactive2,plot_costa_rica_interactive3, nrows=1 ,margin = 0.05)

Croatia - HR

croatia <- vaccinations[grep("HRV", vaccinations$iso_code),]
croatia_world_pop <- world_population[grep("Croatia", world_population$Country),]

croatia$population = croatia_world_pop$Population
croatia$percentage = (croatia$people_vaccinated/croatia$population)*100
plot_croatia <- croatia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇭🇷") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_croatia_1 = plot_croatia+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_croatia_1 = plot_croatia_1 + ggtitle("Population Vaccinated \n on Croatia (2021)") + 
    theme(plot.title = element_text(size = 6, face = "bold"))

plot_croatia_percentage <- croatia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇭🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_croatia_2 = plot_croatia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_croatia_2 = plot_croatia_2 + ggtitle("Population (%) Vaccinated on Croatia") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_croatia_interactive <- plot_ly(x = croatia$date, y = croatia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_croatia_interactive2 <- plot_ly(x = croatia$date, y = croatia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_croatia_interactive3 <- plot_ly(x = croatia$date, y = croatia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_croatia_interactive,plot_croatia_interactive2,plot_croatia_interactive3, nrows=1)

Cyprus - CY

cyprus <- vaccinations[grep("CYP", vaccinations$iso_code),]
cyprus_world_pop <- world_population[grep("Cyprus", world_population$Country),]

cyprus$population = cyprus_world_pop$Population
cyprus$percentage = (cyprus$people_vaccinated/cyprus$population)*100
plot_cyprus <- cyprus %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇾") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_cyprus_1 = plot_cyprus+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_cyprus_1 = plot_cyprus_1 + ggtitle("Population Vaccinated \n on Cyprus (2021)") + 
    theme(plot.title = element_text(size = 6, face = "bold"))

plot_cyprus_percentage <- cyprus %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇾") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_cyprus_2 = plot_cyprus_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_cyprus_2 = plot_cyprus_2 + ggtitle("Population (%) Vaccinated on Cyprus") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_cyprus_interactive <- plot_ly(x = cyprus$date, y = cyprus$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_cyprus_interactive2 <- plot_ly(x = cyprus$date, y = cyprus$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_cyprus_interactive3 <- plot_ly(x = cyprus$date, y = cyprus$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_cyprus_interactive,plot_cyprus_interactive2,plot_cyprus_interactive3, nrows=1)

Czech Republic - CZ

czech_rep <- vaccinations[grep("CZE", vaccinations$iso_code),]
czech_rep_world_pop <- world_population[grep("Czech", world_population$Country),]

czech_rep$population = czech_rep_world_pop$Population
czech_rep$percentage = (czech_rep$people_vaccinated/czech_rep$population)*100

plot_czech_rep <- czech_rep %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇿") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_czech_rep_1 = plot_czech_rep+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_czech_rep_1 = plot_czech_rep_1 + ggtitle("Population Vaccinated \n on Czech Rep. (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_czech_rep_percentage <- czech_rep %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇨🇿") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_czech_rep_2 = plot_czech_rep_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_czech_rep_2 = plot_czech_rep_2 + ggtitle("Population (%) Vaccinated \n on Czech Rep.") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_czech_rep_interactive <- plot_ly(x = czech_rep$date, y = czech_rep$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_czech_rep_interactive2 <- plot_ly(x = czech_rep$date, y = czech_rep$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_czech_rep_interactive3 <- plot_ly(x = czech_rep$date, y = czech_rep$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_czech_rep_interactive,plot_czech_rep_interactive2,plot_czech_rep_interactive3, nrows=1)

Denmark - DK

denmark <- vaccinations[grep("DNK", vaccinations$iso_code),]
denmark_world_pop <- world_population[grep("Denmark", world_population$Country),]

denmark$population = denmark_world_pop$Population
denmark$percentage = (denmark$people_vaccinated/denmark$population)*100
plot_denmark <- denmark %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇩🇰") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()
    
plot_denmark_1 = plot_denmark+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_denmark_1 = plot_denmark_1 + ggtitle("Population Vaccinated on Denmark (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_denmark_percentage <- denmark %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇩🇰") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_denmark_2 = plot_denmark_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_denmark_2 = plot_denmark_2 + ggtitle("Population (%) Vaccinated \n on Denmark") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_denmark_interactive <- plot_ly(x = denmark$date, y = denmark$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_denmark_interactive2 <- plot_ly(x = denmark$date, y = denmark$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_denmark_interactive3 <- plot_ly(x = denmark$date, y = denmark$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_denmark_interactive,plot_denmark_interactive2,plot_denmark_interactive3, nrows=1)

Estonia - EE

estonia <- vaccinations[grep("EST", vaccinations$iso_code),]
estonia_world_pop <- world_population[grep("Estonia", world_population$Country),]

estonia$population = estonia_world_pop$Population
estonia$percentage = (estonia$people_vaccinated/estonia$population)*100
plot_estonia <- estonia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇪🇪") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_estonia_1 = plot_estonia+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_estonia_1 = plot_estonia_1 + ggtitle("Population Vaccinated \n on Estonia (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_estonia_percentage <- estonia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇪🇪") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_estonia_2 = plot_estonia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_estonia_2 = plot_estonia_2 + ggtitle("Population (%) Vaccinated \n on Estonia") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_estonia_interactive <- plot_ly(x = estonia$date, y = estonia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_estonia_interactive2 <- plot_ly(x = estonia$date, y = estonia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_estonia_interactive3 <- plot_ly(x = estonia$date, y = estonia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_estonia_interactive,plot_estonia_interactive2,plot_estonia_interactive3, nrows=1)

Finland - FI

finland <- vaccinations[grep("FIN", vaccinations$iso_code),]
finland_world_pop <- world_population[grep("Finland", world_population$Country),]

finland$population = finland_world_pop$Population
finland$percentage = (finland$people_vaccinated/finland$population)*100
plot_finland <- finland %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇫🇮") +
    scale_y_continuous(breaks = seq(0, 100, 20),limits = c(0, 100))+
    theme_wsj()
    
plot_finland_1 = plot_finland+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_finland_1 = plot_finland_1 + ggtitle("Population (%) Vaccinated \n on Finland (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_finland_percentage <- finland %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇫🇮") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_finland_2 = plot_finland_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_finland_2 = plot_finland_2 + ggtitle("Population (%) Vaccinated\n on Finland") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_finland_interactive <- plot_ly(x = finland$date, y = finland$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_finland_interactive2 <- plot_ly(x = finland$date, y = finland$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_finland_interactive3 <- plot_ly(x = finland$date, y = finland$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_finland_interactive,plot_finland_interactive2,plot_finland_interactive3, nrows=1)

France - FR

france <- vaccinations[grep("FRA", vaccinations$iso_code),]
france_world_pop <- world_population[grep("France", world_population$Country),]

france$population = france_world_pop$Population
france$percentage = (france$people_vaccinated/france$population)*100
plot_france <- france %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇫🇷") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_france_1 = plot_france+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_france_1 = plot_france_1 + ggtitle("Population Vaccinated \n on France (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_france_percentage <- france %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇫🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_france_2 = plot_france_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_france_2 = plot_france_2 + ggtitle("Population (%) Vaccinated \n on France") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_france_interactive <- plot_ly(x = france$date, y = france$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_france_interactive2 <- plot_ly(x = france$date, y = france$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_france_interactive3 <- plot_ly(x = france$date, y = france$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_france_interactive,plot_france_interactive2,plot_france_interactive3, nrows=1)

Germany - DE

germany <- vaccinations[grep("DEU", vaccinations$iso_code),]
germany_world_pop <- world_population[grep("Germany", world_population$Country),]

germany$population = germany_world_pop$Population
germany$percentage = (germany$people_vaccinated/germany$population)*100
plot_germany <- germany %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇩🇪") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_germany_1 = plot_germany+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_germany_1 = plot_germany_1 + ggtitle("Population Vaccinated \n on Germany (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_germany_percentage <- germany %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇩🇪") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_germany_2 = plot_germany_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_germany_2 = plot_germany_2 + ggtitle("Population (%) Vaccinated \n on Germany") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_germany_interactive <- plot_ly(x = germany$date, y = germany$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_germany_interactive2 <- plot_ly(x = germany$date, y = germany$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_germany_interactive3 <- plot_ly(x = germany$date, y = germany$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_germany_interactive,plot_germany_interactive2,plot_germany_interactive3, nrows=1)

Gibraltar - GI

gibraltar <- vaccinations[grep("GIB", vaccinations$iso_code),]
gibraltar_world_pop <- world_population[grep("Gibraltar", world_population$Country),]

gibraltar$population = gibraltar_world_pop$Population
gibraltar$percentage = (gibraltar$people_vaccinated/gibraltar$population)*100

plot_gibraltar <- gibraltar %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇬🇮") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_gibraltar_1 = plot_gibraltar+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_gibraltar_1 = plot_gibraltar_1 + ggtitle("Population Vaccinated on Gibraltar (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_gibraltar_percentage <- gibraltar %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇬🇮") +
    scale_y_continuous(breaks = seq(0, 40, 10),limits = c(0, 40))+
    theme_wsj()

plot_gibraltar_2 = plot_gibraltar_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_gibraltar_2 = plot_gibraltar_2 + ggtitle("Population (%) Vaccinated \n on Gibraltar") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_gibraltar_interactive <- plot_ly(x = gibraltar$date, y = gibraltar$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_gibraltar_interactive2 <- plot_ly(x = gibraltar$date, y = gibraltar$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_gibraltar_interactive3 <- plot_ly(x = gibraltar$date, y = gibraltar$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_gibraltar_interactive,plot_gibraltar_interactive2,plot_gibraltar_interactive3, nrows=1)

Greece - GR

greece <- vaccinations[grep("GRC", vaccinations$iso_code),]
greece_world_pop <- world_population[grep("Greece", world_population$Country),]

greece$population = greece_world_pop$Population
greece$percentage = (greece$people_vaccinated/greece$population)*100

plot_greece <- greece %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇬🇷") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_greece_1 = plot_greece+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_greece_1 = plot_greece_1 + ggtitle("Population Vaccinated \n on Greece (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_greece_percentage <- greece %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇬🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_greece_2 = plot_greece_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_greece_2 = plot_greece_2 + ggtitle("Population (%) Vaccinated \n on Greece") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_greece_interactive <- plot_ly(x = greece$date, y = greece$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_greece_interactive2 <- plot_ly(x = greece$date, y = greece$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_greece_interactive3 <- plot_ly(x = greece$date, y = greece$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_greece_interactive,plot_greece_interactive2,plot_greece_interactive3, nrows=1)

Hungary - HU

hungary <- vaccinations[grep("HUN", vaccinations$iso_code),]
hungary_world_pop <- world_population[grep("Hungary", world_population$Country),]

hungary$population = hungary_world_pop$Population
hungary$percentage = (hungary$people_vaccinated/hungary$population)*100

plot_hungary <- hungary %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇭🇺") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_hungary_1 = plot_hungary + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_hungary_1 = plot_hungary_1 + ggtitle("Population (%) Vaccinated \n on Hungary (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_hungary_percentage <- hungary %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇭🇺") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_hungary_2 = plot_hungary_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_hungary_2 = plot_hungary_2 + ggtitle("Population (%) Vaccinated \n on Hungary") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_hungary_interactive <- plot_ly(x = hungary$date, y = hungary$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_hungary_interactive2 <- plot_ly(x = hungary$date, y = hungary$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_hungary_interactive3 <- plot_ly(x = hungary$date, y = hungary$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_hungary_interactive,plot_hungary_interactive2, plot_hungary_interactive3,nrows=1)

Iceland - IS

iceland <- vaccinations[grep("ISL", vaccinations$iso_code),]
iceland_world_pop <- world_population[grep("Iceland", world_population$Country),]

iceland$population = iceland_world_pop$Population
iceland$percentage = (iceland$people_vaccinated/iceland$population)*100

plot_iceland <- iceland %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇸") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_iceland_1 = plot_iceland + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_iceland_1 = plot_iceland_1 + ggtitle("Population Vaccinated on Iceland (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_iceland_percentage <- iceland %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇸") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_iceland_2 = plot_iceland_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_iceland_2 = plot_iceland_2 + ggtitle("Population (%) Vaccinated \n on Iceland") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_iceland_interactive <- plot_ly(x = iceland$date, y = iceland$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_iceland_interactive2 <- plot_ly(x = iceland$date, y = iceland$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_iceland_interactive3 <- plot_ly(x = iceland$date, y = iceland$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_iceland_interactive,plot_iceland_interactive2,plot_iceland_interactive3 ,nrows=1)

India - IN

india <- vaccinations[grep("IND", vaccinations$iso_code),]
india_world_pop <- world_population[grep("India", world_population$Country),]

india$population = india_world_pop$Population
india$percentage = (india$people_vaccinated/india$population)*100


plot_india <- india %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇳") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_india_1 = plot_india + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_india_1 = plot_india_1 + ggtitle("Population Vaccinated on India (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_india_percentage <- india %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇳") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_india_2 = plot_india_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_india_2 = plot_india_2 + ggtitle("Population (%) Vaccinated \n on India (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_india_interactive <- plot_ly(x = india$date, y = india$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_india_interactive2 <- plot_ly(x = india$date, y = india$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_india_interactive3 <- plot_ly(x = india$date, y = india$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_india_interactive,plot_india_interactive2,plot_india_interactive3, nrows=1)

Indonesia - ID

indonesia <- vaccinations[grep("IDN", vaccinations$iso_code),]
indonesia_world_pop <- world_population[grep("Indonesia", world_population$Country),]

indonesia$population = indonesia_world_pop$Population
indonesia$percentage = (indonesia$people_vaccinated/indonesia$population)*100


plot_indonesia <- indonesia %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇩") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_indonesia_1 = plot_indonesia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_indonesia_1 = plot_indonesia_1 + ggtitle("Population Vaccinated on Indonesia (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_indonesia_percentage <- indonesia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇩") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_indonesia_2 = plot_indonesia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_indonesia_2 = plot_indonesia_2 + ggtitle("Population (%) Vaccinated \n on Indonesia (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_indonesia_interactive <- plot_ly(x = indonesia$date, y = indonesia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_indonesia_interactive2 <- plot_ly(x = indonesia$date, y = indonesia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_indonesia_interactive3 <- plot_ly(x = indonesia$date, y = indonesia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_indonesia_interactive,plot_indonesia_interactive2,plot_indonesia_interactive3, nrows=1)

NA

Ireland - IE

ireland <- vaccinations[grep("IRL", vaccinations$iso_code),]
ireland_world_pop <- world_population[grep("Ireland", world_population$Country),]

ireland$population = ireland_world_pop$Population
ireland$percentage = (ireland$people_vaccinated/ireland$population)*100


plot_ireland <- ireland %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇪") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_ireland_1 = plot_ireland + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_ireland_1 = plot_ireland_1 + ggtitle("Population Vaccinated \n on Ireland (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_ireland_percentage <- ireland %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇪") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_ireland_2 = plot_ireland_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_ireland_2 = plot_ireland_2 + ggtitle("Population (%) Vaccinated \n on Ireland (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_ireland_interactive <- plot_ly(x = ireland$date, y = ireland$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_ireland_interactive2 <- plot_ly(x = ireland$date, y = ireland$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_ireland_interactive3 <- plot_ly(x = ireland$date, y = ireland$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_ireland_interactive,plot_ireland_interactive2,plot_ireland_interactive3, nrows=1)

Israel - IL

israel <- vaccinations[grep("ISR", vaccinations$iso_code),]
israel_world_pop <- world_population[grep("Israel", world_population$Country),]

israel$population = israel_world_pop$Population
israel$percentage = (israel$people_vaccinated/israel$population)*100


plot_israel <- israel %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇱") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_israel_1 = plot_israel + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_israel_1 = plot_israel_1 + ggtitle("Population Vaccinated \n on Israel (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_israel_percentage <- israel %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇱") +
    scale_y_continuous(breaks = seq(0, 40, 5),limits = c(0, 40))+
    theme_wsj()

plot_israel_2 = plot_israel_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_israel_2 = plot_israel_2 + ggtitle("Population (%) Vaccinated \n on Israel (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_israel_interactive <- plot_ly(x = israel$date, y = israel$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_israel_interactive2 <- plot_ly(x = israel$date, y = israel$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_israel_interactive3 <- plot_ly(x = israel$date, y = israel$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_israel_interactive,plot_israel_interactive2,plot_israel_interactive3, nrows=1)

Italy - IT

italy <- vaccinations[grep("ITA", vaccinations$iso_code),]
italy_world_pop <- world_population[grep("Italy", world_population$Country),]

italy$population = italy_world_pop$Population
italy$percentage = (italy$people_vaccinated/italy$population)*100


plot_italy <- italy %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇹") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_italy_1 = plot_italy + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_italy_1 = plot_italy_1 + ggtitle("Population Vaccinated \n on Italy(2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_italy_percentage <- italy %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇮🇹") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_italy_2 = plot_italy_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_italy_2 = plot_italy_2 + ggtitle("Population (%) Vaccinated \n on Italy (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_italy_interactive <- plot_ly(x = italy$date, y = italy$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_italy_interactive2 <- plot_ly(x = italy$date, y = italy$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_italy_interactive3 <- plot_ly(x = italy$date, y = italy$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_italy_interactive,plot_italy_interactive2,plot_italy_interactive3, nrows=1)

Kuwait - KW

kuwait <- vaccinations[grep("KWT", vaccinations$iso_code),]
kuwait_world_pop <- world_population[grep("Kuwait", world_population$Country),]

kuwait$population = kuwait_world_pop$Population
kuwait$percentage = (kuwait$people_vaccinated/kuwait$population)*100


plot_kuwait <- kuwait %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇰🇼") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_kuwait_1 = plot_kuwait + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_kuwait_1 = plot_kuwait_1 + ggtitle("Population Vaccinated \n on Kuwait(2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_kuwait_percentage <- kuwait %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇰🇼") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_kuwait_2 = plot_kuwait_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_kuwait_2 = plot_kuwait_2 + ggtitle("Population (%) Vaccinated \n on Kuwait (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_kuwait_interactive <- plot_ly(x = kuwait$date, y = kuwait$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_kuwait_interactive2 <- plot_ly(x = kuwait$date, y = kuwait$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_kuwait_interactive3 <- plot_ly(x = kuwait$date, y = kuwait$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_kuwait_interactive,plot_kuwait_interactive2,plot_kuwait_interactive3, nrows=1)

Latvia - LV

latvia <- vaccinations[grep("LVA", vaccinations$iso_code),]
latvia_world_pop <- world_population[grep("Latvia", world_population$Country),]

latvia$population = latvia_world_pop$Population
latvia$percentage = (latvia$people_vaccinated/latvia$population)*100


plot_latvia <- latvia %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇱🇻") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_latvia_1 = plot_latvia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_latvia_1 = plot_latvia_1 + ggtitle("Population Vaccinated \n on Italy (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_latvia_percentage <- latvia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇱🇻") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_latvia_2 = plot_latvia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_latvia_2 = plot_latvia_2 + ggtitle("Population (%) Vaccinated \n on Latvia ") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_latvia_interactive <- plot_ly(x = latvia$date, y = latvia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_latvia_interactive2 <- plot_ly(x = latvia$date, y = latvia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_latvia_interactive3 <- plot_ly(x = latvia$date, y = latvia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_latvia_interactive,plot_latvia_interactive2,plot_latvia_interactive3, nrows=1)

Lithuania - LT

lithuania <- vaccinations[grep("LTU", vaccinations$iso_code),]
lithuania_world_pop <- world_population[grep("Lithuania", world_population$Country),]

lithuania$population = lithuania_world_pop$Population
lithuania$percentage = (lithuania$people_vaccinated/lithuania$population)*100


plot_lithuania <- lithuania %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇱🇹") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_lithuania_1 = plot_lithuania + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_lithuania_1 = plot_lithuania_1 + ggtitle("Population Vaccinated \n on Lithuania ") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_lithuania_percentage <- lithuania %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇱🇹") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_lithuania_2 = plot_lithuania_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_lithuania_2 = plot_lithuania_2 + ggtitle("Population (%) Vaccinated \n on Lithuania (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_lithuania_interactive <- plot_ly(x = lithuania$date, y = lithuania$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_lithuania_interactive2 <- plot_ly(x = lithuania$date, y = lithuania$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_lithuania_interactive3 <- plot_ly(x = lithuania$date, y = lithuania$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_lithuania_interactive,plot_lithuania_interactive2,plot_lithuania_interactive3, nrows=1)

Luxemberg - LU

luxembourg <- vaccinations[grep("LUX", vaccinations$iso_code),]
luxembourg_world_pop <- world_population[grep("Luxembourg", world_population$Country),]

luxembourg$population = luxembourg_world_pop$Population
luxembourg$percentage = (luxembourg$people_vaccinated/luxembourg$population)*100


plot_luxembourg <- luxembourg %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇱🇺") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_luxembourg_1 = plot_luxembourg + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_luxembourg_1 = plot_luxembourg_1 + ggtitle("Population Vaccinated \n on Luxembourg") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_luxembourg_percentage <- italy %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇱🇺") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_luxembourg_2 = plot_luxembourg_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_luxembourg_2 = plot_luxembourg_2 + ggtitle("Population (%) Vaccinated \n on Luxembourg") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_luxembourg_interactive <- plot_ly(x = luxembourg$date, y = luxembourg$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_luxembourg_interactive2 <- plot_ly(x = luxembourg$date, y = luxembourg$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_luxembourg_interactive3 <- plot_ly(x = luxembourg$date, y = luxembourg$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_luxembourg_interactive,plot_luxembourg_interactive2,plot_luxembourg_interactive3, nrows=1)

Malta - MT

malta <- vaccinations[grep("MLT", vaccinations$iso_code),]
malta_world_pop <- world_population[grep("Malta", world_population$Country),]

malta$population = malta_world_pop$Population
malta$percentage = (malta$people_vaccinated/malta$population)*100


plot_malta <- malta %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇲🇹") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_malta_1 = plot_malta + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_malta_1 = plot_malta_1 + ggtitle("Population Vaccinated \n on Malta (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_malta_percentage <- malta %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇲🇹") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_malta_2 = plot_malta_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_malta_2 = plot_malta_2 + ggtitle("Population (%) Vaccinated \n on Malta") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_malta_interactive <- plot_ly(x = malta$date, y = malta$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_malta_interactive2 <- plot_ly(x = malta$date, y = malta$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_malta_interactive3 <- plot_ly(x = malta$date, y = malta$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_malta_interactive,plot_malta_interactive2,plot_malta_interactive3, nrows=1)

Mexico - MX

mexico <- vaccinations[grep("MEX", vaccinations$iso_code),]
mexico_world_pop <- world_population[grep("Mexico", world_population$Country),]

mexico$population = mexico_world_pop$Population
mexico$percentage = (mexico$people_vaccinated/mexico$population)*100


plot_mexico <- mexico %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇲🇽") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_mexico_1 = plot_mexico + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_mexico_1 = plot_mexico_1 + ggtitle("Population Vaccinated \n on Mexico ") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_mexico_percentage <- mexico %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇲🇽") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_mexico_2 = plot_mexico_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_mexico_2 = plot_mexico_2 + ggtitle("Population (%) Vaccinated \n on Mexico (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_mexico_interactive <- plot_ly(x = mexico$date, y = mexico$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_mexico_interactive2 <- plot_ly(x = mexico$date, y = mexico$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_mexico_interactive3 <- plot_ly(x = mexico$date, y = mexico$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_mexico_interactive,plot_mexico_interactive2,plot_mexico_interactive3, nrows=1)

Norway - NO

norway <- vaccinations[grep("NOR", vaccinations$iso_code),]
norway_world_pop <- world_population[grep("Norway", world_population$Country),]

norway$population = norway_world_pop$Population
norway$percentage = (norway$people_vaccinated/norway$population)*100


plot_norway <- norway %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇳🇴") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_norway_1 = plot_norway + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_norway_1 = plot_norway_1 + ggtitle("Population Vaccinated \n on Norway (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_norway_percentage <- norway %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇳🇴") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_norway_2 = plot_norway_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_norway_2 = plot_norway_2 + ggtitle("Population (%) Vaccinated \n on Morway (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_norway_interactive <- plot_ly(x = norway$date, y = norway$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_norway_interactive2 <- plot_ly(x = norway$date, y = norway$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_norway_interactive3 <- plot_ly(x = norway$date, y = norway$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_norway_interactive,plot_norway_interactive2,plot_norway_interactive3, nrows=1)

Oman - OM

oman <- vaccinations[grep("OMN", vaccinations$iso_code),]
oman_world_pop <- world_population[grep("Oman", world_population$Country),]

oman$population = oman_world_pop$Population
oman$percentage = (oman$people_vaccinated/oman$population)*100


plot_oman <- oman %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇴🇲") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_oman_1 = plot_oman + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_oman_1 = plot_oman_1 + ggtitle("Population Vaccinated \n on Oman(2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_oman_percentage <- oman %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇴🇲") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_oman_2 = plot_oman_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_oman_2 = plot_oman_2 + ggtitle("Population (%) Vaccinated \n on Oman (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_oman_interactive <- plot_ly(x = oman$date, y = oman$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_oman_interactive2 <- plot_ly(x = oman$date, y = oman$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_oman_interactive3 <- plot_ly(x = oman$date, y = oman$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_oman_interactive,plot_oman_interactive2,plot_oman_interactive3, nrows=1)

Panama - PA

panama <- vaccinations[grep("PAN", vaccinations$iso_code),]
panama_world_pop <- world_population[grep("Panama", world_population$Country),]

panama$population = panama_world_pop$Population
panama$percentage = (panama$people_vaccinated/panama$population)*100


plot_panama <- panama %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇵🇦") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_panama_1 = plot_panama + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_panama_1 = plot_panama_1 + ggtitle("Population  Vaccinated \n on Panama (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_panama_percentage <- panama %>%
  ggplot( aes(x=date, y = percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇵🇦") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_panama_2 = plot_panama_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_panama_2 = plot_panama_2 + ggtitle("Population (%) Vaccinated \n on Panama (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_panama_interactive <- plot_ly(x = panama$date, y = panama$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_panama_interactive2 <- plot_ly(x = panama$date, y = panama$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_panama_interactive3 <- plot_ly(x = panama$date, y = panama$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_panama_interactive,plot_panama_interactive2,plot_panama_interactive3, nrows=1)

Poland - PL

poland <- vaccinations[grep("POL", vaccinations$iso_code),]
poland_world_pop <- world_population[grep("Poland", world_population$Country),]

poland$population = poland_world_pop$Population
poland$percentage = (poland$people_vaccinated/poland$population)*100


plot_poland <- poland %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇵🇱") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_poland_1 = plot_poland + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_poland_1 = plot_poland_1 + ggtitle("Population  Vaccinated \n on Poland (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_poland_percentage <- poland %>%
  ggplot( aes(x=date, y = percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇵🇱") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_poland_2 = plot_poland_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_poland_2 = plot_poland_2 + ggtitle("Population (%) Vaccinated \n on Poland (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_poland_interactive <- plot_ly(x = poland$date, y = poland$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_poland_interactive2 <- plot_ly(x = poland$date, y = poland$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_poland_interactive3 <- plot_ly(x = poland$date, y = poland$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_poland_interactive,plot_poland_interactive2,plot_poland_interactive3, nrows=1)

Portugal - PT

portugal <- vaccinations[grep("PRT", vaccinations$iso_code),]
portugal_world_pop <- world_population[grep("Portugal", world_population$Country),]

portugal$population = portugal_world_pop$Population
portugal$percentage = (portugal$people_vaccinated/portugal$population)*100


plot_portugal <- portugal %>%
  ggplot( aes(x=date, y=people_vaccinated, group=1)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇵🇹") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_portugal_1 = plot_portugal + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_portugal_1 = plot_portugal_1 + ggtitle("Population Vaccinated \n on Portugal (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_portugal_percentage <- portugal %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇵🇹") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_portugal_2 = plot_portugal_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_portugal_2 = plot_portugal_2 + ggtitle("Population (%) Vaccinated \n on Portugal (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_portugal_interactive <- plot_ly(x = portugal$date, y = portugal$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_portugal_interactive2 <- plot_ly(x = portugal$date, y = portugal$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_portugal_interactive3 <- plot_ly(x = portugal$date, y = portugal$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_portugal_interactive,plot_portugal_interactive2,plot_portugal_interactive3, nrows=1)

Romania - RO

romania <- vaccinations[grep("ROU", vaccinations$iso_code),]
romania_world_pop <- world_population[grep("Romania", world_population$Country),]

romania$population = romania_world_pop$Population
romania$percentage = (romania$people_vaccinated/romania$population)*100


plot_romania <- romania %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇷🇴") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_romania_1 = plot_romania + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_romania_1 = plot_romania_1 + ggtitle("Vaccination on \n Romania(2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_romania_percentage <- romania %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇷🇴") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_romania_2 = plot_romania_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_romania_2 = plot_romania_2 + ggtitle("Vaccination on \n Romania") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_romania_interactive <- plot_ly(x = romania$date, y = romania$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_romania_interactive2 <- plot_ly(x = romania$date, y = romania$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_romania_interactive3 <- plot_ly(x = romania$date, y = romania$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_romania_interactive,plot_romania_interactive2,plot_romania_interactive3, nrows=1)

Russia - RU

russia <- vaccinations[grep("RUS", vaccinations$iso_code),]
russia_world_pop <- world_population[grep("Russia", world_population$Country),]

russia$population = russia_world_pop$Population
russia$percentage = (russia$people_vaccinated/russia$population)*100


plot_russia <- russia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇷🇺") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_russia_1 = plot_russia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_russia_1 = plot_russia_1 + ggtitle("Vaccination on \n Russia(2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_russia_percentage <- russia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇷🇺") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_russia_2 = plot_russia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_russia_2 = plot_russia_2 + ggtitle("Vaccination on \n Russia") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_russia_interactive <- plot_ly(x = russia$date, y = russia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_russia_interactive2 <- plot_ly(x = russia$date, y = russia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_russia_interactive3 <- plot_ly(x = russia$date, y = russia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_russia_interactive,plot_russia_interactive2,plot_russia_interactive3, nrows=1)

Saudi Arabia - SA

saudi_arabia <- vaccinations[grep("SAU", vaccinations$iso_code),]
saudi_arabia_world_pop <- world_population[grep("Saudi Arabia", world_population$Country),]

saudi_arabia$population = saudi_arabia_world_pop$Population
saudi_arabia$percentage = (saudi_arabia$people_vaccinated/saudi_arabia$population)*100


plot_saudi_arabia <- saudi_arabia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇦") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_saudi_arabia_1 = plot_saudi_arabia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_saudi_arabia_1 = plot_saudi_arabia_1 + ggtitle("Vaccination on \n Saudi Arabia (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_saudi_arabia_percentage <- saudi_arabia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇦") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_saudi_arabia_2 = plot_saudi_arabia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_saudi_arabia_2 = plot_saudi_arabia_2 + ggtitle("Vaccination on \n Saudi Arabia (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_saudi_arabia_interactive <- plot_ly(x = saudi_arabia$date, y = saudi_arabia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_saudi_arabia_interactive2 <- plot_ly(x = saudi_arabia$date, y = saudi_arabia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_saudi_arabia_interactive3 <- plot_ly(x = saudi_arabia$date, y = saudi_arabia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_saudi_arabia_interactive,plot_saudi_arabia_interactive2,plot_saudi_arabia_interactive3, nrows=1)

Serbia - RS

serbia <- vaccinations[grep("SRB", vaccinations$iso_code),]
serbia_world_pop <- world_population[grep("Serbia", world_population$Country),]

serbia$population = serbia_world_pop$Population
serbia$percentage = (serbia$people_vaccinated/serbia$population)*100


plot_serbia <- serbia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇷🇸") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_serbia_1 = plot_serbia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_serbia_1 = plot_serbia_1 + ggtitle("Vaccination on \n Serbia (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_serbia_percentage <- serbia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇷🇸") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_serbia_2 = plot_serbia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_serbia_2 = plot_serbia_2 + ggtitle("Vaccination on \n Serbia (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_serbia_interactive <- plot_ly(x = serbia$date, y = serbia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_serbia_interactive2 <- plot_ly(x = serbia$date, y = serbia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_serbia_interactive3 <- plot_ly(x = serbia$date, y = serbia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_serbia_interactive,plot_serbia_interactive2,plot_serbia_interactive3, nrows=1)

Seychelles - SC

seychelles <- vaccinations[grep("SYC", vaccinations$iso_code),]
seychelles_world_pop <- world_population[grep("Seychelles", world_population$Country),]

seychelles$population = seychelles_world_pop$Population
seychelles$percentage = (seychelles$people_vaccinated/seychelles$population)*100


plot_seychelles <- seychelles %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇨") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_seychelles_1 = plot_seychelles + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_seychelles_1 = plot_seychelles_1 + ggtitle("Vaccination on \n Seychelles (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_seychelles_percentage <- seychelles %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇨") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_seychelles_2 = plot_seychelles_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_seychelles_2 = plot_seychelles_2 + ggtitle("Vaccination on \n Seychelles (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_seychelles_interactive <- plot_ly(x = seychelles$date, y = seychelles$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_seychelles_interactive2 <- plot_ly(x = seychelles$date, y = seychelles$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_seychelles_interactive3 <- plot_ly(x = seychelles$date, y = seychelles$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_seychelles_interactive,plot_seychelles_interactive2,plot_seychelles_interactive3, nrows=1)

Slovakia - SK

slovakia <- vaccinations[grep("SVK", vaccinations$iso_code),]
slovakia_world_pop <- world_population[grep("Slovakia", world_population$Country),]

slovakia$population = slovakia_world_pop$Population
slovakia$percentage = (slovakia$people_vaccinated/slovakia$population)*100


plot_slovakia <- slovakia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇰") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_slovakia_1 = plot_slovakia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_slovakia_1 = plot_slovakia_1 + ggtitle("Vaccination on \n Slovakia (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_slovakia_percentage <- slovakia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇰") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_slovakia_2 = plot_slovakia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_slovakia_2 = plot_slovakia_2 + ggtitle("Vaccination on \n Slovakia (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_slovakia_interactive <- plot_ly(x = slovakia$date, y = slovakia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_slovakia_interactive2 <- plot_ly(x = slovakia$date, y = slovakia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_slovakia_interactive3 <- plot_ly(x = slovakia$date, y = slovakia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_slovakia_interactive,plot_slovakia_interactive2,plot_slovakia_interactive3 , nrows=1)

Slovenia - SI

slovenia <- vaccinations[grep("SVN", vaccinations$iso_code),]
slovenia_world_pop <- world_population[grep("Slovenia", world_population$Country),]

slovenia$population = slovenia_world_pop$Population
slovenia$percentage = (slovenia$people_vaccinated/slovenia$population)*100


plot_slovenia <- slovenia %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇮") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_slovenia_1 = plot_slovenia + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_slovenia_1 = plot_slovenia_1 + ggtitle("Vaccination on \n Slovenia (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_slovenia_percentage <- slovenia %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇮") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_slovenia_2 = plot_slovenia_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_slovenia_2 = plot_slovenia_2 + ggtitle("Vaccination on \n Slovenia (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_slovenia_interactive <- plot_ly(x = slovenia$date, y = slovenia$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_slovenia_interactive2 <- plot_ly(x = slovenia$date, y = slovenia$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_slovenia_interactive3 <- plot_ly(x = slovenia$date, y = slovenia$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_slovenia_interactive,plot_slovenia_interactive2,plot_slovenia_interactive3, nrows=1)

Spain - ES

spain <- vaccinations[grep("ESP", vaccinations$iso_code),]
spain_world_pop <- world_population[grep("Spain", world_population$Country),]

spain$population = spain_world_pop$Population
spain$percentage = (spain$people_vaccinated/spain$population)*100


plot_spain <- spain %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇪🇸") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_spain_1 = plot_spain + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_spain_1 = plot_spain_1 + ggtitle("Vaccination on \n Spain (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_spain_percentage <- spain %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇪🇸") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_spain_2 = plot_spain_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_spain_2 = plot_spain_2 + ggtitle("Vaccination on \n Spain (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_spain_interactive <- plot_ly(x = spain$date, y = spain$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_spain_interactive2 <- plot_ly(x = spain$date, y = spain$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_spain_interactive3 <- plot_ly(x = spain$date, y = spain$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_spain_interactive,plot_spain_interactive2,plot_spain_interactive3, nrows=1)

Sweden - SE

sweden <- vaccinations[grep("SWE", vaccinations$iso_code),]
sweden_world_pop <- world_population[grep("Sweden", world_population$Country),]

sweden$population = sweden_world_pop$Population
sweden$percentage = (sweden$people_vaccinated/sweden$population)*100


plot_sweden <- sweden %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇸🇪") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_sweden_1 = plot_sweden + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))

Turkey - TR

turkey <- vaccinations[grep("TUR", vaccinations$iso_code),]
turkey_world_pop <- world_population[grep("Turkey", world_population$Country),]

turkey$population = turkey_world_pop$Population
turkey$percentage = (turkey$people_vaccinated/turkey$population)*100


plot_turkey <- turkey %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇹🇷") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_turkey_1 = plot_turkey + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_turkey_1 = plot_turkey_1 + ggtitle("Vaccination on \n Turkey (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_turkey_percentage <- turkey %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇹🇷") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_turkey_2 = plot_turkey_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_turkey_2 = plot_turkey_2 + ggtitle("Vaccination on \n Turkey (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_turkey_interactive <- plot_ly(x = turkey$date, y = turkey$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_turkey_interactive2 <- plot_ly(x = turkey$date, y = turkey$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_turkey_interactive3 <- plot_ly(x = turkey$date, y = turkey$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_turkey_interactive,plot_turkey_interactive2,plot_turkey_interactive3, nrows=1)

United Arab Emirates - AE

uae <- vaccinations[grep("ARE", vaccinations$iso_code),]
uae_world_pop <- world_population[grep("United Arab Emirates", world_population$Country),]

uae$population = uae_world_pop$Population
uae$percentage = (uae$people_vaccinated/uae$population)*100


plot_uae <- uae %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇪") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_uae_1 = plot_uae + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_uae_1 = plot_uae_1 + ggtitle("Vaccination on \n UAE (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_uae_percentage <- uae %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇦🇪") +
    scale_y_continuous(breaks = seq(0, 40, 5),limits = c(0, 40))+
    theme_wsj()

plot_uae_2 = plot_uae_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_uae_2 = plot_uae_2 + ggtitle("Vaccination on \n UAE (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_uae_interactive <- plot_ly(x = uae$date, y = uae$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_uae_interactive2 <- plot_ly(x = uae$date, y = uae$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_uae_interactive3 <- plot_ly(x = uae$date, y = uae$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_uae_interactive,plot_uae_interactive2,plot_uae_interactive3, nrows=1)

United Kingdom - UK

uk <- vaccinations[grep("GBR", vaccinations$iso_code),]
uk_world_pop <- world_population[grep("United Kingdom", world_population$Country),]

uk$population = uk_world_pop$Population
uk$percentage = (uk$people_vaccinated/uk$population)*100


plot_uk <- uk %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇬🇧") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_uk_1 = plot_uk + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_uk_1 = plot_uk_1 + ggtitle("Vaccination on \n United Kingdom (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_uk_percentage <- uk %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇬🇧") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_uk_2 = plot_uk_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_uk_2 = plot_uk_2 + ggtitle("Vaccination on \n UK (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_uk_interactive <- plot_ly(x = uk$date, y = uk$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_uk_interactive2 <- plot_ly(x = uk$date, y = uk$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_uk_interactive3 <- plot_ly(x = uk$date, y = uk$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_uk_interactive,plot_uk_interactive2,plot_uk_interactive3 , nrows=1)

United States of America - US

usa <- vaccinations[grep("USA", vaccinations$iso_code),]
usa_world_pop <- world_population[grep("United States", world_population$Country),]

usa$population = usa_world_pop$Population
usa$percentage = (usa$people_vaccinated/usa$population)*100


plot_usa <- usa %>%
  ggplot( aes(x=date, y=people_vaccinated)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇺🇸") +
    scale_y_continuous(breaks = seq(0, 10000000, 2000000),limits = c(0, 10000000))+
    theme_wsj()
    
plot_usa_1 = plot_usa + theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_usa_1 = plot_usa_1 + ggtitle("Vaccination on \n USA (2021)") + 
    theme(plot.title = element_text(size = 10, face = "bold"))

plot_usa_percentage <- usa %>%
  ggplot( aes(x=date, y=percentage)) +
    geom_point()+
    geom_line(color="#69b3a2") +
    xlab("🇺🇸") +
    scale_y_continuous(breaks = seq(0, 20, 2),limits = c(0, 20))+
    theme_wsj()

plot_usa_2 = plot_usa_percentage+ theme(axis.text.x = element_text(face="bold", color="#993333", 
                           size=7, angle=45))
plot_usa_2 = plot_usa_2 + ggtitle("Vaccination on \n USA (2021)") + 
    theme(plot.title = element_text(size = 7, face = "bold"))

plot_usa_interactive <- plot_ly(x = usa$date, y = usa$people_vaccinated, type="scatter", mode="markers", fill = "tozeroy")

plot_usa_interactive2 <- plot_ly(x = usa$date, y = usa$percentage, type="scatter", mode="markers", fill = "tozeroy")
plot_usa_interactive3 <- plot_ly(x = usa$date, y = usa$daily_vaccinations, type="scatter", mode="markers", fill = "tozeroy")

plotly::subplot(plot_usa_interactive,plot_usa_interactive2,plot_usa_interactive3, nrows=1)

Summarizing Plots

Percentage of population vaccinated

x1 = grid.arrange(plot_argentina_2,plot_austria_2,plot_bahrain_2,plot_belgium_2,plot_bulgaria_2, plot_chile_2,nrow=2)

x2 = grid.arrange(plot_china_2 , plot_costa_rica_2, plot_croatia_2, plot_czech_rep_2, plot_denmark_2, plot_estonia_2,nrow=2)

x3 = grid.arrange(plot_finland_2 , plot_france_2 , plot_germany_2,plot_gibraltar_2 , plot_greece_2, plot_hungary_2 , nrow = 2)

x4 = grid.arrange(plot_iceland_2 , plot_india_2 , plot_ireland_2,plot_israel_2 , plot_italy_2, plot_latvia_2 , nrow = 2)

x5 = grid.arrange(plot_lithuania_2 , plot_luxembourg_2 , plot_malta_2,plot_mexico_2 , plot_norway_2, plot_oman_2, nrow = 2)

x6 = grid.arrange(plot_poland_2 , plot_portugal_2 , plot_romania_2,plot_saudi_arabia_2, plot_serbia_2, plot_seychelles_1 , nrow = 2)

x7 = grid.arrange(plot_slovakia_2 , plot_slovenia_2 , plot_spain_2,plot_sweden_2 , plot_turkey_2, plot_uae_2 , plot_uk_2 , plot_usa_2, nrow = 2)

Less Vaccinated Country in terms of Population (% of Population)

vaccinations1 = vaccinations
vaccinations1$percentage[vaccinations$country == "Argentina"] <- max(argentina$percentage , na.rm = TRUE)
vaccinations1$percentage[vaccinations$country == "Austria"] <- max(austria$percentage , na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Bahrain"] <- max(bahrain$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Belgium"] <- max(belgium$percentage, na.rm = TRUE)
vaccinations1$percentage[vaccinations$country == "Brazil"] <- max(brazil$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Bulgaria"] <- max(bulgaria$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Canada"] <- max(canada$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Chile"] <- max(chile$percentage, na.rm = TRUE)
vaccinations1$percentage[vaccinations$country == "China"] <- max(china$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Costa Rica"] <- max(costa_rica$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Croatia"] <- max(croatia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Cyprus"] <- max(cyprus$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Czech"] <- max(czech_rep$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Denmark"] <- max(denmark$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Estonia"] <- max(estonia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Finland"] <- max(finland$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "France"] <- max(france$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Germany"] <- max(germany$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Gibraltar"] <- max(gibraltar$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Greece"] <- max(greece$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Hungary"] <- max(hungary$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Iceland"] <- max(iceland$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "India"] <- max(india$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Indonesia"] <- max(indonesia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Ireland"] <- max(ireland$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Israel"] <- max(israel$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Italy"] <- max(italy$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Kuwait"] <- max(kuwait$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Latvia"] <- max(latvia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Lithuania"] <- max(lithuania$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Luxembourg"] <- max(luxembourg$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Malta"] <- max(malta$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Mexico"] <- max(mexico$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Norway"] <- max(norway$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Oman"] <- max(oman$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Panama"] <- max(panama$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Poland"] <- max(poland$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Portugal"] <- max(portugal$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Romania"] <- max(romania$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Russia"] <- max(russia$percentage, na.rm = TRUE)
vaccinations1$percentage[vaccinations$country == "Saudi Arabia"] <- max(saudi_arabia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Serbia"] <- max(serbia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Seychelles"] <- max(seychelles$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Slovakia"] <- max(slovakia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Slovenia"] <- max(slovenia$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Spain"] <- max(spain$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Sweden"] <- max(sweden$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "Turkey"] <- max(turkey$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "UAE"] <- max(uae$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "United Kingdom"] <- max(uk$percentage, na.rm = TRUE) 
vaccinations1$percentage[vaccinations$country == "United States"] <- max(usa$percentage, na.rm = TRUE) 
x =select(vaccinations1, country, percentage)

y = unique(x) %>% drop_na

yincr = y %>% arrange(y$percentage)
yincr = yincr[!grepl("-Inf", yincr$percentage),]


kable1 =head(yincr,7)
kable1 = kbl(kable1)
kable1
country percentage
Indonesia 0.5908685
India 0.8542487
Oman 0.9525076
Costa Rica 1.1221177
Mexico 1.4100637
Russia 1.5075260
Argentina 1.5365817

Most Vaccinated Country in terms of Population (% of Population)

ydesc = y %>% arrange(y$percentage ,descending=TRUE)

kable2 =tail(ydesc,7)
kable2 = kbl(kable2)
kable2
country percentage
United States 14.63298
Chile 17.28191
Bahrain 17.35427
United Kingdom 28.99279
Seychelles 52.44390
Israel 54.13330
Gibraltar 67.41266

Country Population vaccinated at least once (in Map)

Install necessary packages

library(ggplot2)
install.packages("ggmap")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/ggmap_3.0.0.zip'
Content type 'application/zip' length 4698244 bytes (4.5 MB)
downloaded 4.5 MB
package ‘ggmap’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\yoges\AppData\Local\Temp\RtmpqqmemV\downloaded_packages
library(ggmap)
install.packages("maps")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/maps_3.3.0.zip'
Content type 'application/zip' length 3695866 bytes (3.5 MB)
downloaded 3.5 MB
package ‘maps’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\yoges\AppData\Local\Temp\RtmpqqmemV\downloaded_packages
library(maps)
install.packages("mapdata")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/mapdata_2.3.0.zip'
Content type 'application/zip' length 25640320 bytes (24.5 MB)
downloaded 24.5 MB
package ‘mapdata’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\yoges\AppData\Local\Temp\RtmpqqmemV\downloaded_packages
library(mapdata)
world <- map_data("world")

world$percentage = NA
world$percentage[world$region == "Argentina"] <- max(argentina$percentage, na.rm = TRUE) 
world$percentage[world$region == "Austria"] <- max(austria$percentage, na.rm = TRUE) 
world$percentage[world$region == "Bahrain"] <- max(bahrain$percentage, na.rm = TRUE) 
world$percentage[world$region == "Belgium"] <- max(belgium$percentage, na.rm = TRUE) 
world$percentage[world$region == "Brazil"] <- max(brazil$percentage, na.rm = TRUE)
world$percentage[world$region == "Bulgaria"] <- max(bulgaria$percentage, na.rm = TRUE) 
world$percentage[world$region == "Canada"] <- max(canada$percentage, na.rm = TRUE) 
world$percentage[world$region == "Chile"] <- max(chile$percentage, na.rm = TRUE)
world$percentage[world$region == "China"] <- max(china$percentage, na.rm = TRUE)
world$percentage[world$region == "Costa Rica"] <- max(costa_rica$percentage, na.rm = TRUE)
world$percentage[world$region == "Croatia"] <- max(croatia$percentage, na.rm = TRUE)
world$percentage[world$region == "Cyprus"] <- max(cyprus$percentage, na.rm = TRUE)
world$percentage[world$region == "Denmark"] <- max(denmark$percentage, na.rm = TRUE)
world$percentage[world$region == "Estonia"] <- max(estonia$percentage, na.rm = TRUE)
world$percentage[world$region == "Finland"] <- max(finland$percentage, na.rm = TRUE)
world$percentage[world$region == "France"] <- max(france$percentage, na.rm = TRUE)
world$percentage[world$region == "Germany"] <- max(germany$percentage, na.rm = TRUE)
world$percentage[world$region == "Gibraltar"] <- max(gibraltar$percentage, na.rm = TRUE)
world$percentage[world$region == "Greece"] <- max(greece$percentage, na.rm = TRUE)
world$percentage[world$region == "Hungary"] <- max(hungary$percentage, na.rm = TRUE)
world$percentage[world$region == "Iceland"] <- max(iceland$percentage, na.rm = TRUE)
world$percentage[world$region == "India"] <- max(india$percentage, na.rm = TRUE)
world$percentage[world$region == "Indonesia"] <- max(indonesia$percentage, na.rm = TRUE)
world$percentage[world$region == "Ireland"] <- max(ireland$percentage, na.rm = TRUE)
world$percentage[world$region == "Israel"] <- max(israel$percentage, na.rm = TRUE)
world$percentage[world$region == "Italy"] <- max(italy$percentage, na.rm = TRUE)
world$percentage[world$region == "Kuwait"] <- max(kuwait$percentage, na.rm = TRUE)
world$percentage[world$region == "Latvia"] <- max(latvia$percentage, na.rm = TRUE)
world$percentage[world$region == "Lithuania"] <- max(lithuania$percentage, na.rm = TRUE)
world$percentage[world$region == "Luxembourg"] <- max(luxembourg$percentage, na.rm = TRUE)
world$percentage[world$region == "Malta"] <- max(malta$percentage, na.rm = TRUE)
world$percentage[world$region == "Mexico"] <- max(mexico$percentage, na.rm = TRUE)
world$percentage[world$region == "Norway"] <- max(norway$percentage, na.rm = TRUE)
world$percentage[world$region == "Oman"] <- max(oman$percentage, na.rm = TRUE)
world$percentage[world$region == "Panama"] <- max(panama$percentage, na.rm = TRUE)
world$percentage[world$region == "Poland"] <- max(poland$percentage, na.rm = TRUE)
world$percentage[world$region == "Portugal"] <- max(portugal$percentage, na.rm = TRUE)
world$percentage[world$region == "Romania"] <- max(romania$percentage, na.rm = TRUE)
world$percentage[world$region == "Russia"] <- max(russia$percentage, na.rm = TRUE)
world$percentage[world$region == "Saudi Arabia"] <- max(saudi_arabia$percentage, na.rm = TRUE)
world$percentage[world$region == "Serbia"] <- max(serbia$percentage, na.rm = TRUE)
world$percentage[world$region == "Seychelles"] <- max(seychelles$percentage, na.rm = TRUE)
world$percentage[world$region == "Slovakia"] <- max(slovakia$percentage, na.rm = TRUE)
world$percentage[world$region == "Slovenia"] <- max(slovenia$percentage, na.rm = TRUE)
world$percentage[world$region == "Spain"] <- max(spain$percentage, na.rm = TRUE)
world$percentage[world$region == "Sweden"] <- max(sweden$percentage, na.rm = TRUE)
world$percentage[world$region == "United Arab Emirates"] <- max(uae$percentage, na.rm = TRUE)
world$percentage[world$region == "USA"] <- max(usa$percentage, na.rm = TRUE)
world$percentage[world$region == "UK"] <- max(uk$percentage, na.rm = TRUE)

ca_base = ggplot(data = world, mapping = aes(x = long, y = lat , group = group)) + 
  coord_fixed(1.3)
elbow_room1 = ca_base + 
      geom_polygon(data = world, aes(fill = percentage), color = "black") +
      geom_polygon(color = "black", fill = NA) +
      theme_bw()

elbow_room1 + scale_fill_gradient(low = "light blue", high = "dark blue", na.value = NA)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIEluc3RhbGwgbmVjZXNzYXJ5IHBhY2thZ2VzDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQppbnN0YWxsLnBhY2thZ2VzKCJzdW1tYXJ5dG9vbHMiKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShobXMpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoSG1pc2MpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3lzZm9udHMpDQpmb250X2FkZF9nb29nbGUobmFtZSA9ICJBbWF0aWMgU0MiLCBmYW1pbHkgPSAiYW1hdGljLXNjIikNCg0KbGlicmFyeShzZikNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpDQpsaWJyYXJ5KHN1bW1hcnl0b29scykNCmBgYA0KIyMgSW1wb3J0IGRhdGFzZXRzDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCnZhY2NpbmF0aW9ucyA9IHJlYWRfY3N2KCJjb3VudHJ5X3ZhY2NpbmF0aW9ucy5jc3YiKQ0Kd29ybGRfcG9wdWxhdGlvbiA9IHJlYWRfY3N2KCJ3b3JsZF9wb3B1bGF0aW9uX2J5X2NvdW50cmllcy5jc3YiKQ0KYGBgDQojIyBEYXRhc2V0IFByZXZpZXcNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KZGF0YXRhYmxlKHZhY2NpbmF0aW9ucywgb3B0aW9ucyA9IGxpc3QoDQogIHNlYXJjaGluZyA9IEZBTFNFLA0KICBwYWdlTGVuZ3RoID0gMTAsDQogIGxlbmd0aE1lbnUgPSBjKDEwLCAxMCwgMTUsIDIwKQ0KKSkNCmBgYA0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpkYXRhdGFibGUod29ybGRfcG9wdWxhdGlvbiwgb3B0aW9ucyA9IGxpc3QoDQogIHNlYXJjaGluZyA9IEZBTFNFLA0KICBwYWdlTGVuZ3RoID0gMTAsDQogIGxlbmd0aE1lbnUgPSBjKDEwLCAxMCwgMTUsIDIwKQ0KKSkNCmBgYA0KIyMgRGVzY3JpcHRpdmUgU3RhdHMNCmBgYHtyfQ0KZGVzY3JpYmUodmFjY2luYXRpb25zLCBkZXNjcmlwdCA9ICJMaWZlIEV4cGVjdGFuY3kiKSAlPiUgaHRtbCgpDQpgYGBgYA0KIyMgQ291bnRyeXdpc2UgUGxvdHMNCg0KUGxvdCAtLSBWYWNjaW5lcyBwZXIgZGF5IHwgUGVyY2VudGFnZSBvZiB2YWNjaW5lZCBwb3B1bGF0aW9uIHwgRGFpbHkgVmFjY2luYXRpb25zDQoNCiMjIyBBcmdlbnRpbmEgLSBBUg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmFyZ2VudGluYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiQVJHIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQphcmdlbnRpbmFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiQXJnZW50aW5hIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCg0KYXJnZW50aW5hJHBvcHVsYXRpb24gPSBhcmdlbnRpbmFfd29ybGRfcG9wJFBvcHVsYXRpb24NCmFyZ2VudGluYSRwZXJjZW50YWdlID0gKGFyZ2VudGluYSRwZW9wbGVfdmFjY2luYXRlZC9hcmdlbnRpbmEkcG9wdWxhdGlvbikqMTAwDQoNCnBsb3RfYXJnZW50aW5hIDwtIGFyZ2VudGluYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HpvCfh7ciKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9hcmdlbnRpbmFfMSA9IHBsb3RfYXJnZW50aW5hDQpwbG90X2FyZ2VudGluYV8xID0gcGxvdF9hcmdlbnRpbmFfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBvbiBcbiBBcmdlbnRpbmEgKDIwMjEpIikgKyANCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KDQpwbG90X2FyZ2VudGluYV9wZXJjZW50YWdlIDwtIGFyZ2VudGluYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UsIGdyb3VwPTEpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4em8J+HtyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9hcmdlbnRpbmFfMiA9IHBsb3RfYXJnZW50aW5hX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2FyZ2VudGluYV8yID0gcGxvdF9hcmdlbnRpbmFfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gQXJnZW50aW5hIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KDQpwbG90X2FyZ2VudGluYV9kYWlseV92YWMgPC0gYXJnZW50aW5hICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9ZGFpbHlfdmFjY2luYXRpb25zKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HpvCfh7ciKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KDQpwbG90X2FyZ2VudGluYV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBhcmdlbnRpbmEkZGF0ZSwgeSA9IGFyZ2VudGluYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9hcmdlbnRpbmFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGFyZ2VudGluYSRkYXRlLCB5ID0gYXJnZW50aW5hJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfYXJnZW50aW5hX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBhcmdlbnRpbmEkZGF0ZSwgeSA9IGFyZ2VudGluYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9hcmdlbnRpbmFfaW50ZXJhY3RpdmUscGxvdF9hcmdlbnRpbmFfaW50ZXJhY3RpdmUyLHBsb3RfYXJnZW50aW5hX2ludGVyYWN0aXZlMywgbnJvd3M9MSAsIG1hcmdpbj0gMC4wNSkNCmBgYA0KDQojIyMgQXVzdHJpYSAtIEFUDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KYXVzdHJpYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiQVVUIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQphdXN0cmlhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIkF1c3RyaWEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KYXVzdHJpYSRwb3B1bGF0aW9uID0gYXVzdHJpYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0KYXVzdHJpYSRwZXJjZW50YWdlID0gKGF1c3RyaWEkcGVvcGxlX3ZhY2NpbmF0ZWQvYXVzdHJpYSRwb3B1bGF0aW9uKSoxMDANCg0KcGxvdF9hdXN0cmlhIDwtIGF1c3RyaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6bwn4e5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9hdXN0cmlhXzEgPSBwbG90X2F1c3RyaWErIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2F1c3RyaWFfMSA9IHBsb3RfYXVzdHJpYV8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIG9uIFxuIEF1c3RyaWEgKDIwMjEpIikNCg0KcGxvdF9hdXN0cmlhX3BlcmNlbnRhZ2UgPC0gYXVzdHJpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4em8J+HuSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9hdXN0cmlhXzIgPSBwbG90X2F1c3RyaWFfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfYXVzdHJpYV8yID0gcGxvdF9hdXN0cmlhXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIEF1c3RyaWEiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2F1c3RyaWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gYXVzdHJpYSRkYXRlLCB5ID0gYXVzdHJpYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9hdXN0cmlhX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBhdXN0cmlhJGRhdGUsIHkgPSBhdXN0cmlhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfYXVzdHJpYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gYXVzdHJpYSRkYXRlLCB5ID0gYXVzdHJpYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfYXVzdHJpYV9pbnRlcmFjdGl2ZSxwbG90X2F1c3RyaWFfaW50ZXJhY3RpdmUyLHBsb3RfYXVzdHJpYV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEgLCBtYXJnaW49IDAuMDUpDQpgYGANCg0KIyMjIEJhaHJhaW4gLSBCSA0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmJhaHJhaW4gPC0gdmFjY2luYXRpb25zW2dyZXAoIkJIUiIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KYmFocmFpbl93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJCYWhyYWluIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmJhaHJhaW4kcG9wdWxhdGlvbiA9IGJhaHJhaW5fd29ybGRfcG9wJFBvcHVsYXRpb24NCmJhaHJhaW4kcGVyY2VudGFnZSA9IChiYWhyYWluJHBlb3BsZV92YWNjaW5hdGVkL2JhaHJhaW4kcG9wdWxhdGlvbikqMTAwDQoNCg0KYmFocmFpbiRwZXJjZW50YWdlW2lzLm5hKGJhaHJhaW4kcGVyY2VudGFnZSldIDwtIHJvdW5kKG1lYW4oYmFocmFpbiRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpKQ0KDQpwbG90X2JhaHJhaW4gPC0gYmFocmFpbiAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Hp/Cfh60iKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2JhaHJhaW5fMSA9IHBsb3RfYmFocmFpbisgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfYmFocmFpbl8xID0gcGxvdF9iYWhyYWluXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBcbiBWYWNjaW5hdGVkIG9uIFxuIEJhaHJhaW4gKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfYmFocmFpbl9wZXJjZW50YWdlIDwtIGJhaHJhaW4gJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Hp/Cfh60iKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfYmFocmFpbl8yID0gcGxvdF9iYWhyYWluX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2JhaHJhaW5fMiA9IHBsb3RfYmFocmFpbl8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIFxuIG9uIEJhaHJhaW4iKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2JhaHJhaW5faW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gYmFocmFpbiRkYXRlLCB5ID0gYmFocmFpbiRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9iYWhyYWluX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBiYWhyYWluJGRhdGUsIHkgPSBiYWhyYWluJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfYmFocmFpbl9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gYmFocmFpbiRkYXRlLCB5ID0gYmFocmFpbiRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9iYWhyYWluX2ludGVyYWN0aXZlLHBsb3RfYmFocmFpbl9pbnRlcmFjdGl2ZTIscGxvdF9iYWhyYWluX2ludGVyYWN0aXZlMywgbnJvd3M9MSAsIG1hcmdpbiA9IDAuMDUpDQpgYGANCg0KIyMjIEJlbGdpdW0gLSBCRQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmJlbGdpdW0gPC0gdmFjY2luYXRpb25zW2dyZXAoIkJFTCIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KYmVsZ2l1bV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJCZWxnaXVtIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmJlbGdpdW0kcG9wdWxhdGlvbiA9IGJlbGdpdW1fd29ybGRfcG9wJFBvcHVsYXRpb24NCmJlbGdpdW0kcGVyY2VudGFnZSA9IChiZWxnaXVtJHBlb3BsZV92YWNjaW5hdGVkL2JlbGdpdW0kcG9wdWxhdGlvbikqMTAwDQpwbG90X2JlbGdpdW0gPC0gYmVsZ2l1bSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Hp/Cfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2JlbGdpdW1fMSA9IHBsb3RfYmVsZ2l1bSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfYmVsZ2l1bV8xID0gcGxvdF9iZWxnaXVtXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBcbiBWYWNjaW5hdGVkIG9uIFxuIEJlbGdpdW0gKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfYmVsZ2l1bV9wZXJjZW50YWdlIDwtIGJlbGdpdW0gJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Hp/Cfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfYmVsZ2l1bV8yID0gcGxvdF9iZWxnaXVtX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2JlbGdpdW1fMiA9IHBsb3RfYmVsZ2l1bV8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBCZWxnaXVtIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9iZWxnaXVtX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGJlbGdpdW0kZGF0ZSwgeSA9IGJlbGdpdW0kcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9iZWxnaXVtX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBiZWxnaXVtJGRhdGUsIHkgPSBiZWxnaXVtJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfYmVsZ2l1bV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gYmVsZ2l1bSRkYXRlLCB5ID0gYmVsZ2l1bSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfYmVsZ2l1bV9pbnRlcmFjdGl2ZSxwbG90X2JlbGdpdW1faW50ZXJhY3RpdmUyLHBsb3RfYmVsZ2l1bV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEgLCBtYXJnaW4gPSAwLjA1KQ0KYGBgDQoNCiMjIyBCcmF6aWwgLSBCUg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmJyYXppbCA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiQlJBIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpicmF6aWxfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiQnJhemlsIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmJyYXppbCRwb3B1bGF0aW9uID0gYnJhemlsX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpicmF6aWwkcGVyY2VudGFnZSA9IChicmF6aWwkcGVvcGxlX3ZhY2NpbmF0ZWQvYnJhemlsJHBvcHVsYXRpb24pKjEwMA0KcGxvdF9icmF6aWwgPC0gYnJhemlsICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4en8J+HtyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfYnJhemlsXzEgPSBwbG90X2JyYXppbCsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfYnJhemlsXzEgPSBwbG90X2JyYXppbF8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgXG4gVmFjY2luYXRlZCBvbiBcbiBCcmF6aWwgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfYnJhemlsX3BlcmNlbnRhZ2UgPC0gYnJhemlsICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6fwn4e3IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2JyYXppbF8yID0gcGxvdF9icmF6aWxfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfYnJhemlsXzIgPSBwbG90X2JyYXppbF8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBCcmF6aWwiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2JyYXppbF9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBicmF6aWwkZGF0ZSwgeSA9IGJyYXppbCRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2JyYXppbF9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gYnJhemlsJGRhdGUsIHkgPSBicmF6aWwkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9icmF6aWxfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGJyYXppbCRkYXRlLCB5ID0gYnJhemlsJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9icmF6aWxfaW50ZXJhY3RpdmUscGxvdF9icmF6aWxfaW50ZXJhY3RpdmUyLHBsb3RfYnJhemlsX2ludGVyYWN0aXZlMywgbnJvd3M9MSAsIG1hcmdpbiA9IDAuMDUpDQpgYGANCg0KIyMjIEJ1bGdhcmlhIC0gQkcNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpidWxnYXJpYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiQkdSIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpidWxnYXJpYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJCdWxnYXJpYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpidWxnYXJpYSRwb3B1bGF0aW9uID0gYnVsZ2FyaWFfd29ybGRfcG9wJFBvcHVsYXRpb24NCmJ1bGdhcmlhJHBlcmNlbnRhZ2UgPSAoYnVsZ2FyaWEkcGVvcGxlX3ZhY2NpbmF0ZWQvYnVsZ2FyaWEkcG9wdWxhdGlvbikqMTAwDQpwbG90X2J1bGdhcmlhIDwtIGJ1bGdhcmlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4en8J+HrCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfYnVsZ2FyaWFfMSA9IHBsb3RfYnVsZ2FyaWErIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2J1bGdhcmlhXzEgPSBwbG90X2J1bGdhcmlhXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgb24gIFxuIEJ1bGdhcmlhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2J1bGdhcmlhX3BlcmNlbnRhZ2UgPC0gYnVsZ2FyaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Hp/Cfh6wiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfYnVsZ2FyaWFfMiA9IHBsb3RfYnVsZ2FyaWFfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfYnVsZ2FyaWFfMiA9IHBsb3RfYnVsZ2FyaWFfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gQnVsZ2FyaWEiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KICAgIA0KcGxvdF9idWxnYXJpYV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBidWxnYXJpYSRkYXRlLCB5ID0gYnVsZ2FyaWEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9idWxnYXJpYV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gYnVsZ2FyaWEkZGF0ZSwgeSA9IGJ1bGdhcmlhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfYnVsZ2FyaWFfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGJ1bGdhcmlhJGRhdGUsIHkgPSBidWxnYXJpYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfYnVsZ2FyaWFfaW50ZXJhY3RpdmUscGxvdF9idWxnYXJpYV9pbnRlcmFjdGl2ZTIscGxvdF9idWxnYXJpYV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEgLCBtYXJnaW49MC4wNSkNCmBgYA0KDQojIyMgQ2FuYWRhIC0gQ0ENCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpjYW5hZGEgPC0gdmFjY2luYXRpb25zW2dyZXAoIkNBTiIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KY2FuYWRhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIkNhbmFkYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpjYW5hZGEkcG9wdWxhdGlvbiA9IGNhbmFkYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0KY2FuYWRhJHBlcmNlbnRhZ2UgPSAoY2FuYWRhJHBlb3BsZV92YWNjaW5hdGVkL2NhbmFkYSRwb3B1bGF0aW9uKSoxMDANCnBsb3RfY2FuYWRhIDwtIGNhbmFkYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqPCfh6YiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2NhbmFkYV8xID0gcGxvdF9jYW5hZGErIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2NhbmFkYV8xID0gcGxvdF9jYW5hZGFfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgb24gQ2FuYWRhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2NhbmFkYV9wZXJjZW50YWdlIDwtIGNhbmFkYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eo8J+HpiIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9jYW5hZGFfMiA9IHBsb3RfY2FuYWRhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2NhbmFkYV8xID0gcGxvdF9jYW5hZGFfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBDYW5hZGEiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2NhbmFkYV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBjYW5hZGEkZGF0ZSwgeSA9IGNhbmFkYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2NhbmFkYV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gY2FuYWRhJGRhdGUsIHkgPSBjYW5hZGEkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9jYW5hZGFfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGNhbmFkYSRkYXRlLCB5ID0gY2FuYWRhJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9jYW5hZGFfaW50ZXJhY3RpdmUscGxvdF9jYW5hZGFfaW50ZXJhY3RpdmUyLHBsb3RfY2FuYWRhX2ludGVyYWN0aXZlMyAsbnJvd3M9MSAsIG1hcmdpbiA9IDAuMDUpDQpgYGANCg0KIyMjIENoaWxlIC0gQ0wNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpjaGlsZSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiQ0hMIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpjaGlsZV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJDaGlsZSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpjaGlsZSRwb3B1bGF0aW9uID0gY2hpbGVfd29ybGRfcG9wJFBvcHVsYXRpb24NCmNoaWxlJHBlcmNlbnRhZ2UgPSAoY2hpbGUkcGVvcGxlX3ZhY2NpbmF0ZWQvY2hpbGUkcG9wdWxhdGlvbikqMTAwDQpwbG90X2NoaWxlPC0gY2hpbGUgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6jwn4exIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9jaGlsZV8xID0gcGxvdF9jaGlsZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfY2hpbGVfMSA9IHBsb3RfY2hpbGVfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBvbiBDaGlsZSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2NoaWxlX3BlcmNlbnRhZ2UgPC0gY2hpbGUgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqPCfh7EiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfY2hpbGVfMiA9IHBsb3RfY2hpbGVfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfY2hpbGVfMiA9IHBsb3RfY2hpbGVfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCglKSBcbiAgb24gQ2hpbGUiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2NoaWxlX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGNoaWxlJGRhdGUsIHkgPSBjaGlsZSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2NoaWxlX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBjaGlsZSRkYXRlLCB5ID0gY2hpbGUkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9jaGlsZV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gY2hpbGUkZGF0ZSwgeSA9IGNoaWxlJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9jaGlsZV9pbnRlcmFjdGl2ZSxwbG90X2NoaWxlX2ludGVyYWN0aXZlMixwbG90X2NoaWxlX2ludGVyYWN0aXZlMywgbnJvd3M9MSAsIG1hcmdpbiA9IDAuMDUpDQpgYGANCg0KIyMjIENoaW5hIC0gQ04NCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpjaGluYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiQ0hOIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpjaGluYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJDaGluYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpjaGluYSRwb3B1bGF0aW9uID0gY2hpbmFfd29ybGRfcG9wJFBvcHVsYXRpb24NCmNoaW5hJHBlcmNlbnRhZ2UgPSAoY2hpbmEkcGVvcGxlX3ZhY2NpbmF0ZWQvY2hpbmEkcG9wdWxhdGlvbikqMTAwDQpwbG90X2NoaW5hIDwtIGNoaW5hICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eo8J+HsyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfY2hpbmFfMSA9IHBsb3RfY2hpbmErIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2NoaW5hXzEgPSBwbG90X2NoaW5hXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgb24gQ2hpbmEgKDIwMjAvMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfY2hpbmFfcGVyY2VudGFnZSA8LSBjaGluYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eo8J+HsyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9jaGluYV8yID0gcGxvdF9jaGluYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9jaGluYV8yID0gcGxvdF9jaGluYV8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBDaGluYSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfY2hpbmFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gY2hpbmEkZGF0ZSwgeSA9IGNoaW5hJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfY2hpbmFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGNoaW5hJGRhdGUsIHkgPSBjaGluYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2NoaW5hX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBjaGluYSRkYXRlLCB5ID0gY2hpbmEkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2NoaW5hX2ludGVyYWN0aXZlLHBsb3RfY2hpbmFfaW50ZXJhY3RpdmUyLHBsb3RfY2hpbmFfaW50ZXJhY3RpdmUzLCBucm93cz0xICwgbWFyZ2luID0gMC4wNSkNCmBgYGANCg0KIyMjIENvc3RhIFJpY2EgLSBDUg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmNvc3RhX3JpY2EgPC0gdmFjY2luYXRpb25zW2dyZXAoIkNSSSIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KY29zdGFfcmljYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJDb3N0YSBSaWNhIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmNvc3RhX3JpY2EkcG9wdWxhdGlvbiA9IGNvc3RhX3JpY2Ffd29ybGRfcG9wJFBvcHVsYXRpb24NCmNvc3RhX3JpY2EkcGVyY2VudGFnZSA9IChjb3N0YV9yaWNhJHBlb3BsZV92YWNjaW5hdGVkL2Nvc3RhX3JpY2EkcG9wdWxhdGlvbikqMTAwDQoNCg0KDQpwbG90X2Nvc3RhX3JpY2EgPC0gY29zdGFfcmljYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqPCfh7ciKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2Nvc3RhX3JpY2FfMSA9IHBsb3RfY29zdGFfcmljYSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfY29zdGFfcmljYV8xID0gcGxvdF9jb3N0YV9yaWNhXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIENvc3RhIFJpY2EiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2Nvc3RhX3JpY2FfcGVyY2VudGFnZSA8LSBjb3N0YV9yaWNhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6jwn4e3IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2Nvc3RhX3JpY2FfMiA9IHBsb3RfY29zdGFfcmljYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9jb3N0YV9yaWNhXzIgPSBwbG90X2Nvc3RhX3JpY2FfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG5vbiAgQ29zdGEgUmljYSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfY29zdGFfcmljYV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBjb3N0YV9yaWNhJGRhdGUsIHkgPSBjb3N0YV9yaWNhJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfY29zdGFfcmljYV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gY29zdGFfcmljYSRkYXRlLCB5ID0gY29zdGFfcmljYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2Nvc3RhX3JpY2FfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGNvc3RhX3JpY2EkZGF0ZSwgeSA9IGNvc3RhX3JpY2EkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2Nvc3RhX3JpY2FfaW50ZXJhY3RpdmUscGxvdF9jb3N0YV9yaWNhX2ludGVyYWN0aXZlMixwbG90X2Nvc3RhX3JpY2FfaW50ZXJhY3RpdmUzLCBucm93cz0xICxtYXJnaW4gPSAwLjA1KQ0KYGBgDQoNCiMjIyBDcm9hdGlhIC0gSFINCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpjcm9hdGlhIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJIUlYiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCmNyb2F0aWFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiQ3JvYXRpYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpjcm9hdGlhJHBvcHVsYXRpb24gPSBjcm9hdGlhX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpjcm9hdGlhJHBlcmNlbnRhZ2UgPSAoY3JvYXRpYSRwZW9wbGVfdmFjY2luYXRlZC9jcm9hdGlhJHBvcHVsYXRpb24pKjEwMA0KcGxvdF9jcm9hdGlhIDwtIGNyb2F0aWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh63wn4e3IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9jcm9hdGlhXzEgPSBwbG90X2Nyb2F0aWErIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2Nyb2F0aWFfMSA9IHBsb3RfY3JvYXRpYV8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIFxuIG9uIENyb2F0aWEgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9jcm9hdGlhX3BlcmNlbnRhZ2UgPC0gY3JvYXRpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4et8J+HtyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9jcm9hdGlhXzIgPSBwbG90X2Nyb2F0aWFfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfY3JvYXRpYV8yID0gcGxvdF9jcm9hdGlhXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIG9uIENyb2F0aWEiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2Nyb2F0aWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gY3JvYXRpYSRkYXRlLCB5ID0gY3JvYXRpYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2Nyb2F0aWFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGNyb2F0aWEkZGF0ZSwgeSA9IGNyb2F0aWEkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9jcm9hdGlhX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBjcm9hdGlhJGRhdGUsIHkgPSBjcm9hdGlhJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9jcm9hdGlhX2ludGVyYWN0aXZlLHBsb3RfY3JvYXRpYV9pbnRlcmFjdGl2ZTIscGxvdF9jcm9hdGlhX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgQ3lwcnVzIC0gQ1kNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpjeXBydXMgPC0gdmFjY2luYXRpb25zW2dyZXAoIkNZUCIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KY3lwcnVzX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIkN5cHJ1cyIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpjeXBydXMkcG9wdWxhdGlvbiA9IGN5cHJ1c193b3JsZF9wb3AkUG9wdWxhdGlvbg0KY3lwcnVzJHBlcmNlbnRhZ2UgPSAoY3lwcnVzJHBlb3BsZV92YWNjaW5hdGVkL2N5cHJ1cyRwb3B1bGF0aW9uKSoxMDANCnBsb3RfY3lwcnVzIDwtIGN5cHJ1cyAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqPCfh74iKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2N5cHJ1c18xID0gcGxvdF9jeXBydXMrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2N5cHJ1c18xID0gcGxvdF9jeXBydXNfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBDeXBydXMgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9jeXBydXNfcGVyY2VudGFnZSA8LSBjeXBydXMgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqPCfh74iKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfY3lwcnVzXzIgPSBwbG90X2N5cHJ1c19wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9jeXBydXNfMiA9IHBsb3RfY3lwcnVzXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIG9uIEN5cHJ1cyIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfY3lwcnVzX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGN5cHJ1cyRkYXRlLCB5ID0gY3lwcnVzJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfY3lwcnVzX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBjeXBydXMkZGF0ZSwgeSA9IGN5cHJ1cyRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2N5cHJ1c19pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gY3lwcnVzJGRhdGUsIHkgPSBjeXBydXMkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2N5cHJ1c19pbnRlcmFjdGl2ZSxwbG90X2N5cHJ1c19pbnRlcmFjdGl2ZTIscGxvdF9jeXBydXNfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBDemVjaCBSZXB1YmxpYyAtIENaDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KY3plY2hfcmVwIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJDWkUiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCmN6ZWNoX3JlcF93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJDemVjaCIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpjemVjaF9yZXAkcG9wdWxhdGlvbiA9IGN6ZWNoX3JlcF93b3JsZF9wb3AkUG9wdWxhdGlvbg0KY3plY2hfcmVwJHBlcmNlbnRhZ2UgPSAoY3plY2hfcmVwJHBlb3BsZV92YWNjaW5hdGVkL2N6ZWNoX3JlcCRwb3B1bGF0aW9uKSoxMDANCg0KcGxvdF9jemVjaF9yZXAgPC0gY3plY2hfcmVwICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eo8J+HvyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfY3plY2hfcmVwXzEgPSBwbG90X2N6ZWNoX3JlcCsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfY3plY2hfcmVwXzEgPSBwbG90X2N6ZWNoX3JlcF8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIFxuIG9uIEN6ZWNoIFJlcC4gKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfY3plY2hfcmVwX3BlcmNlbnRhZ2UgPC0gY3plY2hfcmVwICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6jwn4e/IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2N6ZWNoX3JlcF8yID0gcGxvdF9jemVjaF9yZXBfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfY3plY2hfcmVwXzIgPSBwbG90X2N6ZWNoX3JlcF8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBDemVjaCBSZXAuIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9jemVjaF9yZXBfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gY3plY2hfcmVwJGRhdGUsIHkgPSBjemVjaF9yZXAkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9jemVjaF9yZXBfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGN6ZWNoX3JlcCRkYXRlLCB5ID0gY3plY2hfcmVwJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfY3plY2hfcmVwX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBjemVjaF9yZXAkZGF0ZSwgeSA9IGN6ZWNoX3JlcCRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfY3plY2hfcmVwX2ludGVyYWN0aXZlLHBsb3RfY3plY2hfcmVwX2ludGVyYWN0aXZlMixwbG90X2N6ZWNoX3JlcF9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIERlbm1hcmsgLSBESw0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmRlbm1hcmsgPC0gdmFjY2luYXRpb25zW2dyZXAoIkROSyIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KZGVubWFya193b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJEZW5tYXJrIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmRlbm1hcmskcG9wdWxhdGlvbiA9IGRlbm1hcmtfd29ybGRfcG9wJFBvcHVsYXRpb24NCmRlbm1hcmskcGVyY2VudGFnZSA9IChkZW5tYXJrJHBlb3BsZV92YWNjaW5hdGVkL2Rlbm1hcmskcG9wdWxhdGlvbikqMTAwDQpwbG90X2Rlbm1hcmsgPC0gZGVubWFyayAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqfCfh7AiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2Rlbm1hcmtfMSA9IHBsb3RfZGVubWFyaysgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZGVubWFya18xID0gcGxvdF9kZW5tYXJrXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgb24gRGVubWFyayAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9kZW5tYXJrX3BlcmNlbnRhZ2UgPC0gZGVubWFyayAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4ep8J+HsCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9kZW5tYXJrXzIgPSBwbG90X2Rlbm1hcmtfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZGVubWFya18yID0gcGxvdF9kZW5tYXJrXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIERlbm1hcmsiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2Rlbm1hcmtfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gZGVubWFyayRkYXRlLCB5ID0gZGVubWFyayRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2Rlbm1hcmtfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGRlbm1hcmskZGF0ZSwgeSA9IGRlbm1hcmskcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9kZW5tYXJrX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBkZW5tYXJrJGRhdGUsIHkgPSBkZW5tYXJrJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9kZW5tYXJrX2ludGVyYWN0aXZlLHBsb3RfZGVubWFya19pbnRlcmFjdGl2ZTIscGxvdF9kZW5tYXJrX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgRXN0b25pYSAtIEVFDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KZXN0b25pYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiRVNUIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQplc3RvbmlhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIkVzdG9uaWEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KZXN0b25pYSRwb3B1bGF0aW9uID0gZXN0b25pYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0KZXN0b25pYSRwZXJjZW50YWdlID0gKGVzdG9uaWEkcGVvcGxlX3ZhY2NpbmF0ZWQvZXN0b25pYSRwb3B1bGF0aW9uKSoxMDANCnBsb3RfZXN0b25pYSA8LSBlc3RvbmlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eq8J+HqiIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfZXN0b25pYV8xID0gcGxvdF9lc3RvbmlhKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9lc3RvbmlhXzEgPSBwbG90X2VzdG9uaWFfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBFc3RvbmlhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfZXN0b25pYV9wZXJjZW50YWdlIDwtIGVzdG9uaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqvCfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfZXN0b25pYV8yID0gcGxvdF9lc3RvbmlhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2VzdG9uaWFfMiA9IHBsb3RfZXN0b25pYV8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBFc3RvbmlhIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9lc3RvbmlhX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGVzdG9uaWEkZGF0ZSwgeSA9IGVzdG9uaWEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9lc3RvbmlhX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBlc3RvbmlhJGRhdGUsIHkgPSBlc3RvbmlhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfZXN0b25pYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gZXN0b25pYSRkYXRlLCB5ID0gZXN0b25pYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfZXN0b25pYV9pbnRlcmFjdGl2ZSxwbG90X2VzdG9uaWFfaW50ZXJhY3RpdmUyLHBsb3RfZXN0b25pYV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIEZpbmxhbmQgLSBGSQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmZpbmxhbmQgPC0gdmFjY2luYXRpb25zW2dyZXAoIkZJTiIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KZmlubGFuZF93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJGaW5sYW5kIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmZpbmxhbmQkcG9wdWxhdGlvbiA9IGZpbmxhbmRfd29ybGRfcG9wJFBvcHVsYXRpb24NCmZpbmxhbmQkcGVyY2VudGFnZSA9IChmaW5sYW5kJHBlb3BsZV92YWNjaW5hdGVkL2ZpbmxhbmQkcG9wdWxhdGlvbikqMTAwDQpwbG90X2ZpbmxhbmQgPC0gZmlubGFuZCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Hq/Cfh64iKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAsIDIwKSxsaW1pdHMgPSBjKDAsIDEwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2ZpbmxhbmRfMSA9IHBsb3RfZmlubGFuZCsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZmlubGFuZF8xID0gcGxvdF9maW5sYW5kXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIEZpbmxhbmQgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9maW5sYW5kX3BlcmNlbnRhZ2UgPC0gZmlubGFuZCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4er8J+HriIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9maW5sYW5kXzIgPSBwbG90X2ZpbmxhbmRfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZmlubGFuZF8yID0gcGxvdF9maW5sYW5kXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkXG4gb24gRmlubGFuZCIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfZmlubGFuZF9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBmaW5sYW5kJGRhdGUsIHkgPSBmaW5sYW5kJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfZmlubGFuZF9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gZmlubGFuZCRkYXRlLCB5ID0gZmlubGFuZCRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2ZpbmxhbmRfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGZpbmxhbmQkZGF0ZSwgeSA9IGZpbmxhbmQkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2ZpbmxhbmRfaW50ZXJhY3RpdmUscGxvdF9maW5sYW5kX2ludGVyYWN0aXZlMixwbG90X2ZpbmxhbmRfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBGcmFuY2UgLSBGUg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmZyYW5jZSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiRlJBIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpmcmFuY2Vfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiRnJhbmNlIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmZyYW5jZSRwb3B1bGF0aW9uID0gZnJhbmNlX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpmcmFuY2UkcGVyY2VudGFnZSA9IChmcmFuY2UkcGVvcGxlX3ZhY2NpbmF0ZWQvZnJhbmNlJHBvcHVsYXRpb24pKjEwMA0KcGxvdF9mcmFuY2UgPC0gZnJhbmNlICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQsIGdyb3VwPTEpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4er8J+HtyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfZnJhbmNlXzEgPSBwbG90X2ZyYW5jZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZnJhbmNlXzEgPSBwbG90X2ZyYW5jZV8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIFxuIG9uIEZyYW5jZSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2ZyYW5jZV9wZXJjZW50YWdlIDwtIGZyYW5jZSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4er8J+HtyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9mcmFuY2VfMiA9IHBsb3RfZnJhbmNlX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2ZyYW5jZV8yID0gcGxvdF9mcmFuY2VfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gRnJhbmNlIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9mcmFuY2VfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gZnJhbmNlJGRhdGUsIHkgPSBmcmFuY2UkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9mcmFuY2VfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGZyYW5jZSRkYXRlLCB5ID0gZnJhbmNlJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfZnJhbmNlX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBmcmFuY2UkZGF0ZSwgeSA9IGZyYW5jZSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfZnJhbmNlX2ludGVyYWN0aXZlLHBsb3RfZnJhbmNlX2ludGVyYWN0aXZlMixwbG90X2ZyYW5jZV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIEdlcm1hbnkgLSBERQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmdlcm1hbnkgPC0gdmFjY2luYXRpb25zW2dyZXAoIkRFVSIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KZ2VybWFueV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJHZXJtYW55Iiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmdlcm1hbnkkcG9wdWxhdGlvbiA9IGdlcm1hbnlfd29ybGRfcG9wJFBvcHVsYXRpb24NCmdlcm1hbnkkcGVyY2VudGFnZSA9IChnZXJtYW55JHBlb3BsZV92YWNjaW5hdGVkL2dlcm1hbnkkcG9wdWxhdGlvbikqMTAwDQpwbG90X2dlcm1hbnkgPC0gZ2VybWFueSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HqfCfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2dlcm1hbnlfMSA9IHBsb3RfZ2VybWFueSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZ2VybWFueV8xID0gcGxvdF9nZXJtYW55XzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gR2VybWFueSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2dlcm1hbnlfcGVyY2VudGFnZSA8LSBnZXJtYW55ICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6nwn4eqIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2dlcm1hbnlfMiA9IHBsb3RfZ2VybWFueV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9nZXJtYW55XzIgPSBwbG90X2dlcm1hbnlfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gR2VybWFueSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfZ2VybWFueV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBnZXJtYW55JGRhdGUsIHkgPSBnZXJtYW55JHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfZ2VybWFueV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gZ2VybWFueSRkYXRlLCB5ID0gZ2VybWFueSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2dlcm1hbnlfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGdlcm1hbnkkZGF0ZSwgeSA9IGdlcm1hbnkkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2dlcm1hbnlfaW50ZXJhY3RpdmUscGxvdF9nZXJtYW55X2ludGVyYWN0aXZlMixwbG90X2dlcm1hbnlfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBHaWJyYWx0YXIgLSBHSQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmdpYnJhbHRhciA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiR0lCIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpnaWJyYWx0YXJfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiR2licmFsdGFyIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmdpYnJhbHRhciRwb3B1bGF0aW9uID0gZ2licmFsdGFyX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpnaWJyYWx0YXIkcGVyY2VudGFnZSA9IChnaWJyYWx0YXIkcGVvcGxlX3ZhY2NpbmF0ZWQvZ2licmFsdGFyJHBvcHVsYXRpb24pKjEwMA0KDQpwbG90X2dpYnJhbHRhciA8LSBnaWJyYWx0YXIgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6zwn4euIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9naWJyYWx0YXJfMSA9IHBsb3RfZ2licmFsdGFyKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9naWJyYWx0YXJfMSA9IHBsb3RfZ2licmFsdGFyXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgb24gR2licmFsdGFyICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2dpYnJhbHRhcl9wZXJjZW50YWdlIDwtIGdpYnJhbHRhciAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4es8J+HriIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwLCAxMCksbGltaXRzID0gYygwLCA0MCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfZ2licmFsdGFyXzIgPSBwbG90X2dpYnJhbHRhcl9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9naWJyYWx0YXJfMiA9IHBsb3RfZ2licmFsdGFyXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIEdpYnJhbHRhciIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfZ2licmFsdGFyX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGdpYnJhbHRhciRkYXRlLCB5ID0gZ2licmFsdGFyJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfZ2licmFsdGFyX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBnaWJyYWx0YXIkZGF0ZSwgeSA9IGdpYnJhbHRhciRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2dpYnJhbHRhcl9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gZ2licmFsdGFyJGRhdGUsIHkgPSBnaWJyYWx0YXIkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2dpYnJhbHRhcl9pbnRlcmFjdGl2ZSxwbG90X2dpYnJhbHRhcl9pbnRlcmFjdGl2ZTIscGxvdF9naWJyYWx0YXJfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBHcmVlY2UgLSBHUg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmdyZWVjZSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiR1JDIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpncmVlY2Vfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiR3JlZWNlIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmdyZWVjZSRwb3B1bGF0aW9uID0gZ3JlZWNlX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpncmVlY2UkcGVyY2VudGFnZSA9IChncmVlY2UkcGVvcGxlX3ZhY2NpbmF0ZWQvZ3JlZWNlJHBvcHVsYXRpb24pKjEwMA0KDQpwbG90X2dyZWVjZSA8LSBncmVlY2UgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6zwn4e3IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9ncmVlY2VfMSA9IHBsb3RfZ3JlZWNlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9ncmVlY2VfMSA9IHBsb3RfZ3JlZWNlXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gR3JlZWNlICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfZ3JlZWNlX3BlcmNlbnRhZ2UgPC0gZ3JlZWNlICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6zwn4e3IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2dyZWVjZV8yID0gcGxvdF9ncmVlY2VfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfZ3JlZWNlXzIgPSBwbG90X2dyZWVjZV8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBHcmVlY2UiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2dyZWVjZV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBncmVlY2UkZGF0ZSwgeSA9IGdyZWVjZSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2dyZWVjZV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gZ3JlZWNlJGRhdGUsIHkgPSBncmVlY2UkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9ncmVlY2VfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGdyZWVjZSRkYXRlLCB5ID0gZ3JlZWNlJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9ncmVlY2VfaW50ZXJhY3RpdmUscGxvdF9ncmVlY2VfaW50ZXJhY3RpdmUyLHBsb3RfZ3JlZWNlX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgSHVuZ2FyeSAtIEhVDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KaHVuZ2FyeSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiSFVOIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpodW5nYXJ5X3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIkh1bmdhcnkiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KaHVuZ2FyeSRwb3B1bGF0aW9uID0gaHVuZ2FyeV93b3JsZF9wb3AkUG9wdWxhdGlvbg0KaHVuZ2FyeSRwZXJjZW50YWdlID0gKGh1bmdhcnkkcGVvcGxlX3ZhY2NpbmF0ZWQvaHVuZ2FyeSRwb3B1bGF0aW9uKSoxMDANCg0KcGxvdF9odW5nYXJ5IDwtIGh1bmdhcnkgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh63wn4e6IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9odW5nYXJ5XzEgPSBwbG90X2h1bmdhcnkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9odW5nYXJ5XzEgPSBwbG90X2h1bmdhcnlfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gSHVuZ2FyeSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2h1bmdhcnlfcGVyY2VudGFnZSA8LSBodW5nYXJ5ICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh63wn4e6IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2h1bmdhcnlfMiA9IHBsb3RfaHVuZ2FyeV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9odW5nYXJ5XzIgPSBwbG90X2h1bmdhcnlfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gSHVuZ2FyeSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaHVuZ2FyeV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBodW5nYXJ5JGRhdGUsIHkgPSBodW5nYXJ5JHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfaHVuZ2FyeV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gaHVuZ2FyeSRkYXRlLCB5ID0gaHVuZ2FyeSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2h1bmdhcnlfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGh1bmdhcnkkZGF0ZSwgeSA9IGh1bmdhcnkkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2h1bmdhcnlfaW50ZXJhY3RpdmUscGxvdF9odW5nYXJ5X2ludGVyYWN0aXZlMiwgcGxvdF9odW5nYXJ5X2ludGVyYWN0aXZlMyxucm93cz0xKQ0KYGBgDQoNCiMjIyBJY2VsYW5kIC0gSVMNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQppY2VsYW5kIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJJU0wiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCmljZWxhbmRfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiSWNlbGFuZCIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQppY2VsYW5kJHBvcHVsYXRpb24gPSBpY2VsYW5kX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQppY2VsYW5kJHBlcmNlbnRhZ2UgPSAoaWNlbGFuZCRwZW9wbGVfdmFjY2luYXRlZC9pY2VsYW5kJHBvcHVsYXRpb24pKjEwMA0KDQpwbG90X2ljZWxhbmQgPC0gaWNlbGFuZCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh7giKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2ljZWxhbmRfMSA9IHBsb3RfaWNlbGFuZCArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2ljZWxhbmRfMSA9IHBsb3RfaWNlbGFuZF8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIG9uIEljZWxhbmQgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaWNlbGFuZF9wZXJjZW50YWdlIDwtIGljZWxhbmQgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh7giKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfaWNlbGFuZF8yID0gcGxvdF9pY2VsYW5kX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2ljZWxhbmRfMiA9IHBsb3RfaWNlbGFuZF8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBJY2VsYW5kIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9pY2VsYW5kX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGljZWxhbmQkZGF0ZSwgeSA9IGljZWxhbmQkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9pY2VsYW5kX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBpY2VsYW5kJGRhdGUsIHkgPSBpY2VsYW5kJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfaWNlbGFuZF9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gaWNlbGFuZCRkYXRlLCB5ID0gaWNlbGFuZCRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfaWNlbGFuZF9pbnRlcmFjdGl2ZSxwbG90X2ljZWxhbmRfaW50ZXJhY3RpdmUyLHBsb3RfaWNlbGFuZF9pbnRlcmFjdGl2ZTMgLG5yb3dzPTEpDQpgYGANCg0KIyMjIEluZGlhIC0gSU4NCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQppbmRpYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiSU5EIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQppbmRpYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJJbmRpYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQppbmRpYSRwb3B1bGF0aW9uID0gaW5kaWFfd29ybGRfcG9wJFBvcHVsYXRpb24NCmluZGlhJHBlcmNlbnRhZ2UgPSAoaW5kaWEkcGVvcGxlX3ZhY2NpbmF0ZWQvaW5kaWEkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9pbmRpYSA8LSBpbmRpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh7MiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2luZGlhXzEgPSBwbG90X2luZGlhICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfaW5kaWFfMSA9IHBsb3RfaW5kaWFfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBvbiBJbmRpYSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9pbmRpYV9wZXJjZW50YWdlIDwtIGluZGlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh67wn4ezIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X2luZGlhXzIgPSBwbG90X2luZGlhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2luZGlhXzIgPSBwbG90X2luZGlhXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIEluZGlhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaW5kaWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gaW5kaWEkZGF0ZSwgeSA9IGluZGlhJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfaW5kaWFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IGluZGlhJGRhdGUsIHkgPSBpbmRpYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2luZGlhX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBpbmRpYSRkYXRlLCB5ID0gaW5kaWEkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2luZGlhX2ludGVyYWN0aXZlLHBsb3RfaW5kaWFfaW50ZXJhY3RpdmUyLHBsb3RfaW5kaWFfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBJbmRvbmVzaWEgLSBJRA0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmluZG9uZXNpYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiSUROIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQppbmRvbmVzaWFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiSW5kb25lc2lhIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmluZG9uZXNpYSRwb3B1bGF0aW9uID0gaW5kb25lc2lhX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQppbmRvbmVzaWEkcGVyY2VudGFnZSA9IChpbmRvbmVzaWEkcGVvcGxlX3ZhY2NpbmF0ZWQvaW5kb25lc2lhJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfaW5kb25lc2lhIDwtIGluZG9uZXNpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh6kiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2luZG9uZXNpYV8xID0gcGxvdF9pbmRvbmVzaWEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9pbmRvbmVzaWFfMSA9IHBsb3RfaW5kb25lc2lhXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgb24gSW5kb25lc2lhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2luZG9uZXNpYV9wZXJjZW50YWdlIDwtIGluZG9uZXNpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eu8J+HqSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9pbmRvbmVzaWFfMiA9IHBsb3RfaW5kb25lc2lhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2luZG9uZXNpYV8yID0gcGxvdF9pbmRvbmVzaWFfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gSW5kb25lc2lhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaW5kb25lc2lhX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGluZG9uZXNpYSRkYXRlLCB5ID0gaW5kb25lc2lhJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfaW5kb25lc2lhX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBpbmRvbmVzaWEkZGF0ZSwgeSA9IGluZG9uZXNpYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2luZG9uZXNpYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gaW5kb25lc2lhJGRhdGUsIHkgPSBpbmRvbmVzaWEkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2luZG9uZXNpYV9pbnRlcmFjdGl2ZSxwbG90X2luZG9uZXNpYV9pbnRlcmFjdGl2ZTIscGxvdF9pbmRvbmVzaWFfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KDQpgYGANCg0KIyMjIElyZWxhbmQgLSBJRQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmlyZWxhbmQgPC0gdmFjY2luYXRpb25zW2dyZXAoIklSTCIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KaXJlbGFuZF93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJJcmVsYW5kIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmlyZWxhbmQkcG9wdWxhdGlvbiA9IGlyZWxhbmRfd29ybGRfcG9wJFBvcHVsYXRpb24NCmlyZWxhbmQkcGVyY2VudGFnZSA9IChpcmVsYW5kJHBlb3BsZV92YWNjaW5hdGVkL2lyZWxhbmQkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9pcmVsYW5kIDwtIGlyZWxhbmQgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh67wn4eqIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9pcmVsYW5kXzEgPSBwbG90X2lyZWxhbmQgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9pcmVsYW5kXzEgPSBwbG90X2lyZWxhbmRfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBJcmVsYW5kICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaXJlbGFuZF9wZXJjZW50YWdlIDwtIGlyZWxhbmQgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfaXJlbGFuZF8yID0gcGxvdF9pcmVsYW5kX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2lyZWxhbmRfMiA9IHBsb3RfaXJlbGFuZF8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBJcmVsYW5kICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaXJlbGFuZF9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBpcmVsYW5kJGRhdGUsIHkgPSBpcmVsYW5kJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfaXJlbGFuZF9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gaXJlbGFuZCRkYXRlLCB5ID0gaXJlbGFuZCRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2lyZWxhbmRfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGlyZWxhbmQkZGF0ZSwgeSA9IGlyZWxhbmQkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2lyZWxhbmRfaW50ZXJhY3RpdmUscGxvdF9pcmVsYW5kX2ludGVyYWN0aXZlMixwbG90X2lyZWxhbmRfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBJc3JhZWwgLSBJTA0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmlzcmFlbCA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiSVNSIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQppc3JhZWxfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiSXNyYWVsIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmlzcmFlbCRwb3B1bGF0aW9uID0gaXNyYWVsX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQppc3JhZWwkcGVyY2VudGFnZSA9IChpc3JhZWwkcGVvcGxlX3ZhY2NpbmF0ZWQvaXNyYWVsJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfaXNyYWVsIDwtIGlzcmFlbCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh7EiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2lzcmFlbF8xID0gcGxvdF9pc3JhZWwgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9pc3JhZWxfMSA9IHBsb3RfaXNyYWVsXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gSXNyYWVsICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2lzcmFlbF9wZXJjZW50YWdlIDwtIGlzcmFlbCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eu8J+HsSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwLCA1KSxsaW1pdHMgPSBjKDAsIDQwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9pc3JhZWxfMiA9IHBsb3RfaXNyYWVsX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2lzcmFlbF8yID0gcGxvdF9pc3JhZWxfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gSXNyYWVsICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfaXNyYWVsX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGlzcmFlbCRkYXRlLCB5ID0gaXNyYWVsJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfaXNyYWVsX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBpc3JhZWwkZGF0ZSwgeSA9IGlzcmFlbCRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2lzcmFlbF9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gaXNyYWVsJGRhdGUsIHkgPSBpc3JhZWwkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2lzcmFlbF9pbnRlcmFjdGl2ZSxwbG90X2lzcmFlbF9pbnRlcmFjdGl2ZTIscGxvdF9pc3JhZWxfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBJdGFseSAtIElUDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KaXRhbHkgPC0gdmFjY2luYXRpb25zW2dyZXAoIklUQSIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KaXRhbHlfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiSXRhbHkiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KaXRhbHkkcG9wdWxhdGlvbiA9IGl0YWx5X3dvcmxkX3BvcCRQb3B1bGF0aW9uDQppdGFseSRwZXJjZW50YWdlID0gKGl0YWx5JHBlb3BsZV92YWNjaW5hdGVkL2l0YWx5JHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfaXRhbHkgPC0gaXRhbHkgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh67wn4e5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9pdGFseV8xID0gcGxvdF9pdGFseSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2l0YWx5XzEgPSBwbG90X2l0YWx5XzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gSXRhbHkoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2l0YWx5X3BlcmNlbnRhZ2UgPC0gaXRhbHkgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HrvCfh7kiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfaXRhbHlfMiA9IHBsb3RfaXRhbHlfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfaXRhbHlfMiA9IHBsb3RfaXRhbHlfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gSXRhbHkgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9pdGFseV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBpdGFseSRkYXRlLCB5ID0gaXRhbHkkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9pdGFseV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gaXRhbHkkZGF0ZSwgeSA9IGl0YWx5JHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfaXRhbHlfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGl0YWx5JGRhdGUsIHkgPSBpdGFseSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfaXRhbHlfaW50ZXJhY3RpdmUscGxvdF9pdGFseV9pbnRlcmFjdGl2ZTIscGxvdF9pdGFseV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIEt1d2FpdCAtIEtXDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Ka3V3YWl0IDwtIHZhY2NpbmF0aW9uc1tncmVwKCJLV1QiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCmt1d2FpdF93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJLdXdhaXQiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0Ka3V3YWl0JHBvcHVsYXRpb24gPSBrdXdhaXRfd29ybGRfcG9wJFBvcHVsYXRpb24NCmt1d2FpdCRwZXJjZW50YWdlID0gKGt1d2FpdCRwZW9wbGVfdmFjY2luYXRlZC9rdXdhaXQkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9rdXdhaXQgPC0ga3V3YWl0ICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQsIGdyb3VwPTEpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4ew8J+HvCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfa3V3YWl0XzEgPSBwbG90X2t1d2FpdCArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2t1d2FpdF8xID0gcGxvdF9rdXdhaXRfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBLdXdhaXQoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2t1d2FpdF9wZXJjZW50YWdlIDwtIGt1d2FpdCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4ew8J+HvCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9rdXdhaXRfMiA9IHBsb3Rfa3V3YWl0X3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2t1d2FpdF8yID0gcGxvdF9rdXdhaXRfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gS3V3YWl0ICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfa3V3YWl0X2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGt1d2FpdCRkYXRlLCB5ID0ga3V3YWl0JHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3Rfa3V3YWl0X2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBrdXdhaXQkZGF0ZSwgeSA9IGt1d2FpdCRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2t1d2FpdF9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0ga3V3YWl0JGRhdGUsIHkgPSBrdXdhaXQkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2t1d2FpdF9pbnRlcmFjdGl2ZSxwbG90X2t1d2FpdF9pbnRlcmFjdGl2ZTIscGxvdF9rdXdhaXRfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBMYXR2aWEgLSBMVg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmxhdHZpYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiTFZBIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpsYXR2aWFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiTGF0dmlhIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmxhdHZpYSRwb3B1bGF0aW9uID0gbGF0dmlhX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpsYXR2aWEkcGVyY2VudGFnZSA9IChsYXR2aWEkcGVvcGxlX3ZhY2NpbmF0ZWQvbGF0dmlhJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfbGF0dmlhIDwtIGxhdHZpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HsfCfh7siKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X2xhdHZpYV8xID0gcGxvdF9sYXR2aWEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9sYXR2aWFfMSA9IHBsb3RfbGF0dmlhXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gSXRhbHkgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9sYXR2aWFfcGVyY2VudGFnZSA8LSBsYXR2aWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HsfCfh7siKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfbGF0dmlhXzIgPSBwbG90X2xhdHZpYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9sYXR2aWFfMiA9IHBsb3RfbGF0dmlhXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIExhdHZpYSAiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2xhdHZpYV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBsYXR2aWEkZGF0ZSwgeSA9IGxhdHZpYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X2xhdHZpYV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gbGF0dmlhJGRhdGUsIHkgPSBsYXR2aWEkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9sYXR2aWFfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IGxhdHZpYSRkYXRlLCB5ID0gbGF0dmlhJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9sYXR2aWFfaW50ZXJhY3RpdmUscGxvdF9sYXR2aWFfaW50ZXJhY3RpdmUyLHBsb3RfbGF0dmlhX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgTGl0aHVhbmlhIC0gTFQNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpsaXRodWFuaWEgPC0gdmFjY2luYXRpb25zW2dyZXAoIkxUVSIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KbGl0aHVhbmlhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIkxpdGh1YW5pYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpsaXRodWFuaWEkcG9wdWxhdGlvbiA9IGxpdGh1YW5pYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0KbGl0aHVhbmlhJHBlcmNlbnRhZ2UgPSAobGl0aHVhbmlhJHBlb3BsZV92YWNjaW5hdGVkL2xpdGh1YW5pYSRwb3B1bGF0aW9uKSoxMDANCg0KDQpwbG90X2xpdGh1YW5pYSA8LSBsaXRodWFuaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7Hwn4e5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9saXRodWFuaWFfMSA9IHBsb3RfbGl0aHVhbmlhICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfbGl0aHVhbmlhXzEgPSBwbG90X2xpdGh1YW5pYV8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIFxuIG9uIExpdGh1YW5pYSAiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X2xpdGh1YW5pYV9wZXJjZW50YWdlIDwtIGxpdGh1YW5pYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4ex8J+HuSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9saXRodWFuaWFfMiA9IHBsb3RfbGl0aHVhbmlhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2xpdGh1YW5pYV8yID0gcGxvdF9saXRodWFuaWFfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gTGl0aHVhbmlhICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfbGl0aHVhbmlhX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGxpdGh1YW5pYSRkYXRlLCB5ID0gbGl0aHVhbmlhJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfbGl0aHVhbmlhX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBsaXRodWFuaWEkZGF0ZSwgeSA9IGxpdGh1YW5pYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X2xpdGh1YW5pYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gbGl0aHVhbmlhJGRhdGUsIHkgPSBsaXRodWFuaWEkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X2xpdGh1YW5pYV9pbnRlcmFjdGl2ZSxwbG90X2xpdGh1YW5pYV9pbnRlcmFjdGl2ZTIscGxvdF9saXRodWFuaWFfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBMdXhlbWJlcmcgLSBMVQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmx1eGVtYm91cmcgPC0gdmFjY2luYXRpb25zW2dyZXAoIkxVWCIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KbHV4ZW1ib3VyZ193b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJMdXhlbWJvdXJnIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCmx1eGVtYm91cmckcG9wdWxhdGlvbiA9IGx1eGVtYm91cmdfd29ybGRfcG9wJFBvcHVsYXRpb24NCmx1eGVtYm91cmckcGVyY2VudGFnZSA9IChsdXhlbWJvdXJnJHBlb3BsZV92YWNjaW5hdGVkL2x1eGVtYm91cmckcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9sdXhlbWJvdXJnIDwtIGx1eGVtYm91cmcgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7Hwn4e6IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9sdXhlbWJvdXJnXzEgPSBwbG90X2x1eGVtYm91cmcgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9sdXhlbWJvdXJnXzEgPSBwbG90X2x1eGVtYm91cmdfMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBMdXhlbWJvdXJnIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9sdXhlbWJvdXJnX3BlcmNlbnRhZ2UgPC0gaXRhbHkgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HsfCfh7oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfbHV4ZW1ib3VyZ18yID0gcGxvdF9sdXhlbWJvdXJnX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X2x1eGVtYm91cmdfMiA9IHBsb3RfbHV4ZW1ib3VyZ18yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBMdXhlbWJvdXJnIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9sdXhlbWJvdXJnX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IGx1eGVtYm91cmckZGF0ZSwgeSA9IGx1eGVtYm91cmckcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9sdXhlbWJvdXJnX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBsdXhlbWJvdXJnJGRhdGUsIHkgPSBsdXhlbWJvdXJnJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfbHV4ZW1ib3VyZ19pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gbHV4ZW1ib3VyZyRkYXRlLCB5ID0gbHV4ZW1ib3VyZyRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfbHV4ZW1ib3VyZ19pbnRlcmFjdGl2ZSxwbG90X2x1eGVtYm91cmdfaW50ZXJhY3RpdmUyLHBsb3RfbHV4ZW1ib3VyZ19pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIE1hbHRhIC0gIE1UDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KbWFsdGEgPC0gdmFjY2luYXRpb25zW2dyZXAoIk1MVCIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KbWFsdGFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiTWFsdGEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KbWFsdGEkcG9wdWxhdGlvbiA9IG1hbHRhX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQptYWx0YSRwZXJjZW50YWdlID0gKG1hbHRhJHBlb3BsZV92YWNjaW5hdGVkL21hbHRhJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfbWFsdGEgPC0gbWFsdGEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7Lwn4e5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9tYWx0YV8xID0gcGxvdF9tYWx0YSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X21hbHRhXzEgPSBwbG90X21hbHRhXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gTWFsdGEgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9tYWx0YV9wZXJjZW50YWdlIDwtIG1hbHRhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7Lwn4e5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X21hbHRhXzIgPSBwbG90X21hbHRhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X21hbHRhXzIgPSBwbG90X21hbHRhXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIE1hbHRhIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9tYWx0YV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBtYWx0YSRkYXRlLCB5ID0gbWFsdGEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9tYWx0YV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gbWFsdGEkZGF0ZSwgeSA9IG1hbHRhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfbWFsdGFfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IG1hbHRhJGRhdGUsIHkgPSBtYWx0YSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfbWFsdGFfaW50ZXJhY3RpdmUscGxvdF9tYWx0YV9pbnRlcmFjdGl2ZTIscGxvdF9tYWx0YV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIE1leGljbyAtIE1YDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KbWV4aWNvIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJNRVgiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCm1leGljb193b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJNZXhpY28iLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KbWV4aWNvJHBvcHVsYXRpb24gPSBtZXhpY29fd29ybGRfcG9wJFBvcHVsYXRpb24NCm1leGljbyRwZXJjZW50YWdlID0gKG1leGljbyRwZW9wbGVfdmFjY2luYXRlZC9tZXhpY28kcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9tZXhpY28gPC0gbWV4aWNvICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQsIGdyb3VwPTEpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4ey8J+HvSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfbWV4aWNvXzEgPSBwbG90X21leGljbyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X21leGljb18xID0gcGxvdF9tZXhpY29fMSArIGdndGl0bGUoIlBvcHVsYXRpb24gVmFjY2luYXRlZCBcbiBvbiBNZXhpY28gIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9tZXhpY29fcGVyY2VudGFnZSA8LSBtZXhpY28gJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HsvCfh70iKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfbWV4aWNvXzIgPSBwbG90X21leGljb19wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9tZXhpY29fMiA9IHBsb3RfbWV4aWNvXzIgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICglKSBWYWNjaW5hdGVkIFxuIG9uIE1leGljbyAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X21leGljb19pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBtZXhpY28kZGF0ZSwgeSA9IG1leGljbyRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X21leGljb19pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gbWV4aWNvJGRhdGUsIHkgPSBtZXhpY28kcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9tZXhpY29faW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IG1leGljbyRkYXRlLCB5ID0gbWV4aWNvJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9tZXhpY29faW50ZXJhY3RpdmUscGxvdF9tZXhpY29faW50ZXJhY3RpdmUyLHBsb3RfbWV4aWNvX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgTm9yd2F5IC0gTk8NCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpub3J3YXkgPC0gdmFjY2luYXRpb25zW2dyZXAoIk5PUiIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0Kbm9yd2F5X3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIk5vcndheSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpub3J3YXkkcG9wdWxhdGlvbiA9IG5vcndheV93b3JsZF9wb3AkUG9wdWxhdGlvbg0Kbm9yd2F5JHBlcmNlbnRhZ2UgPSAobm9yd2F5JHBlb3BsZV92YWNjaW5hdGVkL25vcndheSRwb3B1bGF0aW9uKSoxMDANCg0KDQpwbG90X25vcndheSA8LSBub3J3YXkgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7Pwn4e0IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9ub3J3YXlfMSA9IHBsb3Rfbm9yd2F5ICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3Rfbm9yd2F5XzEgPSBwbG90X25vcndheV8xICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiBWYWNjaW5hdGVkIFxuIG9uIE5vcndheSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X25vcndheV9wZXJjZW50YWdlIDwtIG5vcndheSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4ez8J+HtCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9ub3J3YXlfMiA9IHBsb3Rfbm9yd2F5X3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X25vcndheV8yID0gcGxvdF9ub3J3YXlfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gTW9yd2F5ICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfbm9yd2F5X2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IG5vcndheSRkYXRlLCB5ID0gbm9yd2F5JHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3Rfbm9yd2F5X2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBub3J3YXkkZGF0ZSwgeSA9IG5vcndheSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X25vcndheV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gbm9yd2F5JGRhdGUsIHkgPSBub3J3YXkkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X25vcndheV9pbnRlcmFjdGl2ZSxwbG90X25vcndheV9pbnRlcmFjdGl2ZTIscGxvdF9ub3J3YXlfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBPbWFuIC0gT00NCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpvbWFuIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJPTU4iLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCm9tYW5fd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiT21hbiIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpvbWFuJHBvcHVsYXRpb24gPSBvbWFuX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpvbWFuJHBlcmNlbnRhZ2UgPSAob21hbiRwZW9wbGVfdmFjY2luYXRlZC9vbWFuJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3Rfb21hbiA8LSBvbWFuICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQsIGdyb3VwPTEpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e08J+HsiIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfb21hbl8xID0gcGxvdF9vbWFuICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3Rfb21hbl8xID0gcGxvdF9vbWFuXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gT21hbigyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfb21hbl9wZXJjZW50YWdlIDwtIG9tYW4gJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HtPCfh7IiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3Rfb21hbl8yID0gcGxvdF9vbWFuX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X29tYW5fMiA9IHBsb3Rfb21hbl8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBPbWFuICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfb21hbl9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBvbWFuJGRhdGUsIHkgPSBvbWFuJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3Rfb21hbl9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gb21hbiRkYXRlLCB5ID0gb21hbiRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X29tYW5faW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IG9tYW4kZGF0ZSwgeSA9IG9tYW4kZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X29tYW5faW50ZXJhY3RpdmUscGxvdF9vbWFuX2ludGVyYWN0aXZlMixwbG90X29tYW5faW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBQYW5hbWEgLSBQQQ0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnBhbmFtYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiUEFOIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpwYW5hbWFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiUGFuYW1hIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnBhbmFtYSRwb3B1bGF0aW9uID0gcGFuYW1hX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpwYW5hbWEkcGVyY2VudGFnZSA9IChwYW5hbWEkcGVvcGxlX3ZhY2NpbmF0ZWQvcGFuYW1hJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfcGFuYW1hIDwtIHBhbmFtYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HtfCfh6YiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X3BhbmFtYV8xID0gcGxvdF9wYW5hbWEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9wYW5hbWFfMSA9IHBsb3RfcGFuYW1hXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICBWYWNjaW5hdGVkIFxuIG9uIFBhbmFtYSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9wYW5hbWFfcGVyY2VudGFnZSA8LSBwYW5hbWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeSA9IHBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e18J+HpiIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9wYW5hbWFfMiA9IHBsb3RfcGFuYW1hX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3BhbmFtYV8yID0gcGxvdF9wYW5hbWFfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gUGFuYW1hICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfcGFuYW1hX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHBhbmFtYSRkYXRlLCB5ID0gcGFuYW1hJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfcGFuYW1hX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBwYW5hbWEkZGF0ZSwgeSA9IHBhbmFtYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X3BhbmFtYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gcGFuYW1hJGRhdGUsIHkgPSBwYW5hbWEkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X3BhbmFtYV9pbnRlcmFjdGl2ZSxwbG90X3BhbmFtYV9pbnRlcmFjdGl2ZTIscGxvdF9wYW5hbWFfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBQb2xhbmQgLSBQTA0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnBvbGFuZCA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiUE9MIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpwb2xhbmRfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiUG9sYW5kIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnBvbGFuZCRwb3B1bGF0aW9uID0gcG9sYW5kX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpwb2xhbmQkcGVyY2VudGFnZSA9IChwb2xhbmQkcGVvcGxlX3ZhY2NpbmF0ZWQvcG9sYW5kJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfcG9sYW5kIDwtIHBvbGFuZCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkLCBncm91cD0xKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HtfCfh7EiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X3BvbGFuZF8xID0gcGxvdF9wb2xhbmQgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9wb2xhbmRfMSA9IHBsb3RfcG9sYW5kXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uICBWYWNjaW5hdGVkIFxuIG9uIFBvbGFuZCAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9wb2xhbmRfcGVyY2VudGFnZSA8LSBwb2xhbmQgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeSA9IHBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e18J+HsSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9wb2xhbmRfMiA9IHBsb3RfcG9sYW5kX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3BvbGFuZF8yID0gcGxvdF9wb2xhbmRfMiArIGdndGl0bGUoIlBvcHVsYXRpb24gKCUpIFZhY2NpbmF0ZWQgXG4gb24gUG9sYW5kICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfcG9sYW5kX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHBvbGFuZCRkYXRlLCB5ID0gcG9sYW5kJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfcG9sYW5kX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBwb2xhbmQkZGF0ZSwgeSA9IHBvbGFuZCRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X3BvbGFuZF9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gcG9sYW5kJGRhdGUsIHkgPSBwb2xhbmQkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X3BvbGFuZF9pbnRlcmFjdGl2ZSxwbG90X3BvbGFuZF9pbnRlcmFjdGl2ZTIscGxvdF9wb2xhbmRfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBQb3J0dWdhbCAtIFBUDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KcG9ydHVnYWwgPC0gdmFjY2luYXRpb25zW2dyZXAoIlBSVCIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KcG9ydHVnYWxfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiUG9ydHVnYWwiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KcG9ydHVnYWwkcG9wdWxhdGlvbiA9IHBvcnR1Z2FsX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpwb3J0dWdhbCRwZXJjZW50YWdlID0gKHBvcnR1Z2FsJHBlb3BsZV92YWNjaW5hdGVkL3BvcnR1Z2FsJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfcG9ydHVnYWwgPC0gcG9ydHVnYWwgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCwgZ3JvdXA9MSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7Xwn4e5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9wb3J0dWdhbF8xID0gcGxvdF9wb3J0dWdhbCArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3BvcnR1Z2FsXzEgPSBwbG90X3BvcnR1Z2FsXzEgKyBnZ3RpdGxlKCJQb3B1bGF0aW9uIFZhY2NpbmF0ZWQgXG4gb24gUG9ydHVnYWwgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfcG9ydHVnYWxfcGVyY2VudGFnZSA8LSBwb3J0dWdhbCAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e18J+HuSIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9wb3J0dWdhbF8yID0gcGxvdF9wb3J0dWdhbF9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9wb3J0dWdhbF8yID0gcGxvdF9wb3J0dWdhbF8yICsgZ2d0aXRsZSgiUG9wdWxhdGlvbiAoJSkgVmFjY2luYXRlZCBcbiBvbiBQb3J0dWdhbCAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X3BvcnR1Z2FsX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHBvcnR1Z2FsJGRhdGUsIHkgPSBwb3J0dWdhbCRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X3BvcnR1Z2FsX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBwb3J0dWdhbCRkYXRlLCB5ID0gcG9ydHVnYWwkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9wb3J0dWdhbF9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gcG9ydHVnYWwkZGF0ZSwgeSA9IHBvcnR1Z2FsJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9wb3J0dWdhbF9pbnRlcmFjdGl2ZSxwbG90X3BvcnR1Z2FsX2ludGVyYWN0aXZlMixwbG90X3BvcnR1Z2FsX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgUm9tYW5pYSAtIFJPDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Kcm9tYW5pYSA8LSB2YWNjaW5hdGlvbnNbZ3JlcCgiUk9VIiwgdmFjY2luYXRpb25zJGlzb19jb2RlKSxdDQpyb21hbmlhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIlJvbWFuaWEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0Kcm9tYW5pYSRwb3B1bGF0aW9uID0gcm9tYW5pYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0Kcm9tYW5pYSRwZXJjZW50YWdlID0gKHJvbWFuaWEkcGVvcGxlX3ZhY2NpbmF0ZWQvcm9tYW5pYSRwb3B1bGF0aW9uKSoxMDANCg0KDQpwbG90X3JvbWFuaWEgPC0gcm9tYW5pYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Ht/Cfh7QiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X3JvbWFuaWFfMSA9IHBsb3Rfcm9tYW5pYSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3JvbWFuaWFfMSA9IHBsb3Rfcm9tYW5pYV8xICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gUm9tYW5pYSgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X3JvbWFuaWFfcGVyY2VudGFnZSA8LSByb21hbmlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7fwn4e0IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X3JvbWFuaWFfMiA9IHBsb3Rfcm9tYW5pYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9yb21hbmlhXzIgPSBwbG90X3JvbWFuaWFfMiArIGdndGl0bGUoIlZhY2NpbmF0aW9uIG9uIFxuIFJvbWFuaWEiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X3JvbWFuaWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gcm9tYW5pYSRkYXRlLCB5ID0gcm9tYW5pYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X3JvbWFuaWFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHJvbWFuaWEkZGF0ZSwgeSA9IHJvbWFuaWEkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9yb21hbmlhX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSByb21hbmlhJGRhdGUsIHkgPSByb21hbmlhJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9yb21hbmlhX2ludGVyYWN0aXZlLHBsb3Rfcm9tYW5pYV9pbnRlcmFjdGl2ZTIscGxvdF9yb21hbmlhX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgUnVzc2lhIC0gUlUNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpydXNzaWEgPC0gdmFjY2luYXRpb25zW2dyZXAoIlJVUyIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KcnVzc2lhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIlJ1c3NpYSIsIHdvcmxkX3BvcHVsYXRpb24kQ291bnRyeSksXQ0KDQpydXNzaWEkcG9wdWxhdGlvbiA9IHJ1c3NpYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0KcnVzc2lhJHBlcmNlbnRhZ2UgPSAocnVzc2lhJHBlb3BsZV92YWNjaW5hdGVkL3J1c3NpYSRwb3B1bGF0aW9uKSoxMDANCg0KDQpwbG90X3J1c3NpYSA8LSBydXNzaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7fwn4e6IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9ydXNzaWFfMSA9IHBsb3RfcnVzc2lhICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfcnVzc2lhXzEgPSBwbG90X3J1c3NpYV8xICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gUnVzc2lhKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfcnVzc2lhX3BlcmNlbnRhZ2UgPC0gcnVzc2lhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7fwn4e6IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X3J1c3NpYV8yID0gcGxvdF9ydXNzaWFfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfcnVzc2lhXzIgPSBwbG90X3J1c3NpYV8yICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gUnVzc2lhIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9ydXNzaWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gcnVzc2lhJGRhdGUsIHkgPSBydXNzaWEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9ydXNzaWFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHJ1c3NpYSRkYXRlLCB5ID0gcnVzc2lhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfcnVzc2lhX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBydXNzaWEkZGF0ZSwgeSA9IHJ1c3NpYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfcnVzc2lhX2ludGVyYWN0aXZlLHBsb3RfcnVzc2lhX2ludGVyYWN0aXZlMixwbG90X3J1c3NpYV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFNhdWRpIEFyYWJpYSAtIFNBDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Kc2F1ZGlfYXJhYmlhIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJTQVUiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnNhdWRpX2FyYWJpYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJTYXVkaSBBcmFiaWEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0Kc2F1ZGlfYXJhYmlhJHBvcHVsYXRpb24gPSBzYXVkaV9hcmFiaWFfd29ybGRfcG9wJFBvcHVsYXRpb24NCnNhdWRpX2FyYWJpYSRwZXJjZW50YWdlID0gKHNhdWRpX2FyYWJpYSRwZW9wbGVfdmFjY2luYXRlZC9zYXVkaV9hcmFiaWEkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9zYXVkaV9hcmFiaWEgPC0gc2F1ZGlfYXJhYmlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e48J+HpiIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfc2F1ZGlfYXJhYmlhXzEgPSBwbG90X3NhdWRpX2FyYWJpYSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3NhdWRpX2FyYWJpYV8xID0gcGxvdF9zYXVkaV9hcmFiaWFfMSArIGdndGl0bGUoIlZhY2NpbmF0aW9uIG9uIFxuIFNhdWRpIEFyYWJpYSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zYXVkaV9hcmFiaWFfcGVyY2VudGFnZSA8LSBzYXVkaV9hcmFiaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HuPCfh6YiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3Rfc2F1ZGlfYXJhYmlhXzIgPSBwbG90X3NhdWRpX2FyYWJpYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zYXVkaV9hcmFiaWFfMiA9IHBsb3Rfc2F1ZGlfYXJhYmlhXzIgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBTYXVkaSBBcmFiaWEgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zYXVkaV9hcmFiaWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gc2F1ZGlfYXJhYmlhJGRhdGUsIHkgPSBzYXVkaV9hcmFiaWEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9zYXVkaV9hcmFiaWFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHNhdWRpX2FyYWJpYSRkYXRlLCB5ID0gc2F1ZGlfYXJhYmlhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3Rfc2F1ZGlfYXJhYmlhX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBzYXVkaV9hcmFiaWEkZGF0ZSwgeSA9IHNhdWRpX2FyYWJpYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3Rfc2F1ZGlfYXJhYmlhX2ludGVyYWN0aXZlLHBsb3Rfc2F1ZGlfYXJhYmlhX2ludGVyYWN0aXZlMixwbG90X3NhdWRpX2FyYWJpYV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFNlcmJpYSAtIFJTDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Kc2VyYmlhIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJTUkIiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnNlcmJpYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJTZXJiaWEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0Kc2VyYmlhJHBvcHVsYXRpb24gPSBzZXJiaWFfd29ybGRfcG9wJFBvcHVsYXRpb24NCnNlcmJpYSRwZXJjZW50YWdlID0gKHNlcmJpYSRwZW9wbGVfdmFjY2luYXRlZC9zZXJiaWEkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9zZXJiaWEgPC0gc2VyYmlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e38J+HuCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfc2VyYmlhXzEgPSBwbG90X3NlcmJpYSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3NlcmJpYV8xID0gcGxvdF9zZXJiaWFfMSArIGdndGl0bGUoIlZhY2NpbmF0aW9uIG9uIFxuIFNlcmJpYSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zZXJiaWFfcGVyY2VudGFnZSA8LSBzZXJiaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+Ht/Cfh7giKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3Rfc2VyYmlhXzIgPSBwbG90X3NlcmJpYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zZXJiaWFfMiA9IHBsb3Rfc2VyYmlhXzIgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBTZXJiaWEgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zZXJiaWFfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gc2VyYmlhJGRhdGUsIHkgPSBzZXJiaWEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9zZXJiaWFfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHNlcmJpYSRkYXRlLCB5ID0gc2VyYmlhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3Rfc2VyYmlhX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBzZXJiaWEkZGF0ZSwgeSA9IHNlcmJpYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3Rfc2VyYmlhX2ludGVyYWN0aXZlLHBsb3Rfc2VyYmlhX2ludGVyYWN0aXZlMixwbG90X3NlcmJpYV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFNleWNoZWxsZXMgLSBTQw0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnNleWNoZWxsZXMgPC0gdmFjY2luYXRpb25zW2dyZXAoIlNZQyIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0Kc2V5Y2hlbGxlc193b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJTZXljaGVsbGVzIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnNleWNoZWxsZXMkcG9wdWxhdGlvbiA9IHNleWNoZWxsZXNfd29ybGRfcG9wJFBvcHVsYXRpb24NCnNleWNoZWxsZXMkcGVyY2VudGFnZSA9IChzZXljaGVsbGVzJHBlb3BsZV92YWNjaW5hdGVkL3NleWNoZWxsZXMkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9zZXljaGVsbGVzIDwtIHNleWNoZWxsZXMgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7jwn4eoIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9zZXljaGVsbGVzXzEgPSBwbG90X3NleWNoZWxsZXMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zZXljaGVsbGVzXzEgPSBwbG90X3NleWNoZWxsZXNfMSArIGdndGl0bGUoIlZhY2NpbmF0aW9uIG9uIFxuIFNleWNoZWxsZXMgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfc2V5Y2hlbGxlc19wZXJjZW50YWdlIDwtIHNleWNoZWxsZXMgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HuPCfh6giKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3Rfc2V5Y2hlbGxlc18yID0gcGxvdF9zZXljaGVsbGVzX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3NleWNoZWxsZXNfMiA9IHBsb3Rfc2V5Y2hlbGxlc18yICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gU2V5Y2hlbGxlcyAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X3NleWNoZWxsZXNfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gc2V5Y2hlbGxlcyRkYXRlLCB5ID0gc2V5Y2hlbGxlcyRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X3NleWNoZWxsZXNfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHNleWNoZWxsZXMkZGF0ZSwgeSA9IHNleWNoZWxsZXMkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9zZXljaGVsbGVzX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBzZXljaGVsbGVzJGRhdGUsIHkgPSBzZXljaGVsbGVzJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9zZXljaGVsbGVzX2ludGVyYWN0aXZlLHBsb3Rfc2V5Y2hlbGxlc19pbnRlcmFjdGl2ZTIscGxvdF9zZXljaGVsbGVzX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgU2xvdmFraWEgLSBTSw0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnNsb3Zha2lhIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJTVksiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnNsb3Zha2lhX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIlNsb3Zha2lhIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnNsb3Zha2lhJHBvcHVsYXRpb24gPSBzbG92YWtpYV93b3JsZF9wb3AkUG9wdWxhdGlvbg0Kc2xvdmFraWEkcGVyY2VudGFnZSA9IChzbG92YWtpYSRwZW9wbGVfdmFjY2luYXRlZC9zbG92YWtpYSRwb3B1bGF0aW9uKSoxMDANCg0KDQpwbG90X3Nsb3Zha2lhIDwtIHNsb3Zha2lhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e48J+HsCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfc2xvdmFraWFfMSA9IHBsb3Rfc2xvdmFraWEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zbG92YWtpYV8xID0gcGxvdF9zbG92YWtpYV8xICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gU2xvdmFraWEgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfc2xvdmFraWFfcGVyY2VudGFnZSA8LSBzbG92YWtpYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e48J+HsCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9zbG92YWtpYV8yID0gcGxvdF9zbG92YWtpYV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zbG92YWtpYV8yID0gcGxvdF9zbG92YWtpYV8yICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gU2xvdmFraWEgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zbG92YWtpYV9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBzbG92YWtpYSRkYXRlLCB5ID0gc2xvdmFraWEkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9zbG92YWtpYV9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gc2xvdmFraWEkZGF0ZSwgeSA9IHNsb3Zha2lhJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3Rfc2xvdmFraWFfaW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IHNsb3Zha2lhJGRhdGUsIHkgPSBzbG92YWtpYSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3Rfc2xvdmFraWFfaW50ZXJhY3RpdmUscGxvdF9zbG92YWtpYV9pbnRlcmFjdGl2ZTIscGxvdF9zbG92YWtpYV9pbnRlcmFjdGl2ZTMgLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBTbG92ZW5pYSAtIFNJDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Kc2xvdmVuaWEgPC0gdmFjY2luYXRpb25zW2dyZXAoIlNWTiIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0Kc2xvdmVuaWFfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiU2xvdmVuaWEiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0Kc2xvdmVuaWEkcG9wdWxhdGlvbiA9IHNsb3ZlbmlhX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQpzbG92ZW5pYSRwZXJjZW50YWdlID0gKHNsb3ZlbmlhJHBlb3BsZV92YWNjaW5hdGVkL3Nsb3ZlbmlhJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3Rfc2xvdmVuaWEgPC0gc2xvdmVuaWEgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7jwn4euIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF9zbG92ZW5pYV8xID0gcGxvdF9zbG92ZW5pYSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3Nsb3ZlbmlhXzEgPSBwbG90X3Nsb3ZlbmlhXzEgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBTbG92ZW5pYSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zbG92ZW5pYV9wZXJjZW50YWdlIDwtIHNsb3ZlbmlhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7jwn4euIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X3Nsb3ZlbmlhXzIgPSBwbG90X3Nsb3ZlbmlhX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3Nsb3ZlbmlhXzIgPSBwbG90X3Nsb3ZlbmlhXzIgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBTbG92ZW5pYSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X3Nsb3ZlbmlhX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHNsb3ZlbmlhJGRhdGUsIHkgPSBzbG92ZW5pYSRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X3Nsb3ZlbmlhX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSBzbG92ZW5pYSRkYXRlLCB5ID0gc2xvdmVuaWEkcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF9zbG92ZW5pYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gc2xvdmVuaWEkZGF0ZSwgeSA9IHNsb3ZlbmlhJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF9zbG92ZW5pYV9pbnRlcmFjdGl2ZSxwbG90X3Nsb3ZlbmlhX2ludGVyYWN0aXZlMixwbG90X3Nsb3ZlbmlhX2ludGVyYWN0aXZlMywgbnJvd3M9MSkNCmBgYA0KDQojIyMgU3BhaW4gLSBFUw0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnNwYWluIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJFU1AiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnNwYWluX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIlNwYWluIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnNwYWluJHBvcHVsYXRpb24gPSBzcGFpbl93b3JsZF9wb3AkUG9wdWxhdGlvbg0Kc3BhaW4kcGVyY2VudGFnZSA9IChzcGFpbiRwZW9wbGVfdmFjY2luYXRlZC9zcGFpbiRwb3B1bGF0aW9uKSoxMDANCg0KDQpwbG90X3NwYWluIDwtIHNwYWluICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eq8J+HuCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfc3BhaW5fMSA9IHBsb3Rfc3BhaW4gKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zcGFpbl8xID0gcGxvdF9zcGFpbl8xICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gU3BhaW4gKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3Rfc3BhaW5fcGVyY2VudGFnZSA8LSBzcGFpbiAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlcmNlbnRhZ2UpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4eq8J+HuCIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwLCAyKSxsaW1pdHMgPSBjKDAsIDIwKSkrDQogICAgdGhlbWVfd3NqKCkNCg0KcGxvdF9zcGFpbl8yID0gcGxvdF9zcGFpbl9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zcGFpbl8yID0gcGxvdF9zcGFpbl8yICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gU3BhaW4gKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zcGFpbl9pbnRlcmFjdGl2ZSA8LSBwbG90X2x5KHggPSBzcGFpbiRkYXRlLCB5ID0gc3BhaW4kcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9zcGFpbl9pbnRlcmFjdGl2ZTIgPC0gcGxvdF9seSh4ID0gc3BhaW4kZGF0ZSwgeSA9IHNwYWluJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3Rfc3BhaW5faW50ZXJhY3RpdmUzIDwtIHBsb3RfbHkoeCA9IHNwYWluJGRhdGUsIHkgPSBzcGFpbiRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3Rfc3BhaW5faW50ZXJhY3RpdmUscGxvdF9zcGFpbl9pbnRlcmFjdGl2ZTIscGxvdF9zcGFpbl9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFN3ZWRlbiAtIFNFDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Kc3dlZGVuIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJTV0UiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnN3ZWRlbl93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJTd2VkZW4iLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0Kc3dlZGVuJHBvcHVsYXRpb24gPSBzd2VkZW5fd29ybGRfcG9wJFBvcHVsYXRpb24NCnN3ZWRlbiRwZXJjZW50YWdlID0gKHN3ZWRlbiRwZW9wbGVfdmFjY2luYXRlZC9zd2VkZW4kcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF9zd2VkZW4gPC0gc3dlZGVuICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e48J+HqiIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3Rfc3dlZGVuXzEgPSBwbG90X3N3ZWRlbiArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3N3ZWRlbl8xID0gcGxvdF9zd2VkZW5fMSArIGdndGl0bGUoIlZhY2NpbmF0aW9uIG9uIFxuIFN3ZWRlbiAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zd2VkZW5fcGVyY2VudGFnZSA8LSBzd2VkZW4gJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HuPCfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3Rfc3dlZGVuXzIgPSBwbG90X3N3ZWRlbl9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF9zd2VkZW5fMiA9IHBsb3Rfc3dlZGVuXzIgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBTd2VkZW4gKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF9zd2VkZW5faW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gc3dlZGVuJGRhdGUsIHkgPSBzd2VkZW4kcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF9zd2VkZW5faW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHN3ZWRlbiRkYXRlLCB5ID0gc3dlZGVuJHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3Rfc3dlZGVuX2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSBzd2VkZW4kZGF0ZSwgeSA9IHN3ZWRlbiRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3Rfc3dlZGVuX2ludGVyYWN0aXZlLHBsb3Rfc3dlZGVuX2ludGVyYWN0aXZlMixwbG90X3N3ZWRlbl9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFR1cmtleSAtIFRSDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KdHVya2V5IDwtIHZhY2NpbmF0aW9uc1tncmVwKCJUVVIiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnR1cmtleV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJUdXJrZXkiLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KdHVya2V5JHBvcHVsYXRpb24gPSB0dXJrZXlfd29ybGRfcG9wJFBvcHVsYXRpb24NCnR1cmtleSRwZXJjZW50YWdlID0gKHR1cmtleSRwZW9wbGVfdmFjY2luYXRlZC90dXJrZXkkcG9wdWxhdGlvbikqMTAwDQoNCg0KcGxvdF90dXJrZXkgPC0gdHVya2V5ICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVvcGxlX3ZhY2NpbmF0ZWQpKSArDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiAgICB4bGFiKCLwn4e58J+HtyIpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwMDAwLCAyMDAwMDAwKSxsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSkrDQogICAgdGhlbWVfd3NqKCkNCiAgICANCnBsb3RfdHVya2V5XzEgPSBwbG90X3R1cmtleSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3R1cmtleV8xID0gcGxvdF90dXJrZXlfMSArIGdndGl0bGUoIlZhY2NpbmF0aW9uIG9uIFxuIFR1cmtleSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF90dXJrZXlfcGVyY2VudGFnZSA8LSB0dXJrZXkgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZXJjZW50YWdlKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HufCfh7ciKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgMiksbGltaXRzID0gYygwLCAyMCkpKw0KICAgIHRoZW1lX3dzaigpDQoNCnBsb3RfdHVya2V5XzIgPSBwbG90X3R1cmtleV9wZXJjZW50YWdlKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF90dXJrZXlfMiA9IHBsb3RfdHVya2V5XzIgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBUdXJrZXkgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF90dXJrZXlfaW50ZXJhY3RpdmUgPC0gcGxvdF9seSh4ID0gdHVya2V5JGRhdGUsIHkgPSB0dXJrZXkkcGVvcGxlX3ZhY2NpbmF0ZWQsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdF90dXJrZXlfaW50ZXJhY3RpdmUyIDwtIHBsb3RfbHkoeCA9IHR1cmtleSRkYXRlLCB5ID0gdHVya2V5JHBlcmNlbnRhZ2UsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCnBsb3RfdHVya2V5X2ludGVyYWN0aXZlMyA8LSBwbG90X2x5KHggPSB0dXJrZXkkZGF0ZSwgeSA9IHR1cmtleSRkYWlseV92YWNjaW5hdGlvbnMsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgZmlsbCA9ICJ0b3plcm95IikNCg0KcGxvdGx5OjpzdWJwbG90KHBsb3RfdHVya2V5X2ludGVyYWN0aXZlLHBsb3RfdHVya2V5X2ludGVyYWN0aXZlMixwbG90X3R1cmtleV9pbnRlcmFjdGl2ZTMsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFVuaXRlZCBBcmFiIEVtaXJhdGVzIC0gQUUNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQp1YWUgPC0gdmFjY2luYXRpb25zW2dyZXAoIkFSRSIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KdWFlX3dvcmxkX3BvcCA8LSB3b3JsZF9wb3B1bGF0aW9uW2dyZXAoIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnVhZSRwb3B1bGF0aW9uID0gdWFlX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQp1YWUkcGVyY2VudGFnZSA9ICh1YWUkcGVvcGxlX3ZhY2NpbmF0ZWQvdWFlJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfdWFlIDwtIHVhZSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HpvCfh6oiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X3VhZV8xID0gcGxvdF91YWUgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF91YWVfMSA9IHBsb3RfdWFlXzEgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBVQUUgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfdWFlX3BlcmNlbnRhZ2UgPC0gdWFlICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6bwn4eqIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAsIDUpLGxpbWl0cyA9IGMoMCwgNDApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X3VhZV8yID0gcGxvdF91YWVfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfdWFlXzIgPSBwbG90X3VhZV8yICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gVUFFICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfdWFlX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHVhZSRkYXRlLCB5ID0gdWFlJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfdWFlX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSB1YWUkZGF0ZSwgeSA9IHVhZSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X3VhZV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gdWFlJGRhdGUsIHkgPSB1YWUkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X3VhZV9pbnRlcmFjdGl2ZSxwbG90X3VhZV9pbnRlcmFjdGl2ZTIscGxvdF91YWVfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIyBVbml0ZWQgS2luZ2RvbSAtIFVLDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KdWsgPC0gdmFjY2luYXRpb25zW2dyZXAoIkdCUiIsIHZhY2NpbmF0aW9ucyRpc29fY29kZSksXQ0KdWtfd29ybGRfcG9wIDwtIHdvcmxkX3BvcHVsYXRpb25bZ3JlcCgiVW5pdGVkIEtpbmdkb20iLCB3b3JsZF9wb3B1bGF0aW9uJENvdW50cnkpLF0NCg0KdWskcG9wdWxhdGlvbiA9IHVrX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQp1ayRwZXJjZW50YWdlID0gKHVrJHBlb3BsZV92YWNjaW5hdGVkL3VrJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfdWsgPC0gdWsgJT4lDQogIGdncGxvdCggYWVzKHg9ZGF0ZSwgeT1wZW9wbGVfdmFjY2luYXRlZCkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6zwn4enIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwMDAsIDIwMDAwMDApLGxpbWl0cyA9IGMoMCwgMTAwMDAwMDApKSsNCiAgICB0aGVtZV93c2ooKQ0KICAgIA0KcGxvdF91a18xID0gcGxvdF91ayArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3VrXzEgPSBwbG90X3VrXzEgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBVbml0ZWQgS2luZ2RvbSAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkNCg0KcGxvdF91a19wZXJjZW50YWdlIDwtIHVrICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh6zwn4enIikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X3VrXzIgPSBwbG90X3VrX3BlcmNlbnRhZ2UrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0iIzk5MzMzMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT03LCBhbmdsZT00NSkpDQpwbG90X3VrXzIgPSBwbG90X3VrXzIgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBVSyAoMjAyMSkiKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQ0KDQpwbG90X3VrX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHVrJGRhdGUsIHkgPSB1ayRwZW9wbGVfdmFjY2luYXRlZCwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90X3VrX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSB1ayRkYXRlLCB5ID0gdWskcGVyY2VudGFnZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KcGxvdF91a19pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gdWskZGF0ZSwgeSA9IHVrJGRhaWx5X3ZhY2NpbmF0aW9ucywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBmaWxsID0gInRvemVyb3kiKQ0KDQpwbG90bHk6OnN1YnBsb3QocGxvdF91a19pbnRlcmFjdGl2ZSxwbG90X3VrX2ludGVyYWN0aXZlMixwbG90X3VrX2ludGVyYWN0aXZlMyAsIG5yb3dzPTEpDQpgYGANCg0KIyMjIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSAtIFVTDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KdXNhIDwtIHZhY2NpbmF0aW9uc1tncmVwKCJVU0EiLCB2YWNjaW5hdGlvbnMkaXNvX2NvZGUpLF0NCnVzYV93b3JsZF9wb3AgPC0gd29ybGRfcG9wdWxhdGlvbltncmVwKCJVbml0ZWQgU3RhdGVzIiwgd29ybGRfcG9wdWxhdGlvbiRDb3VudHJ5KSxdDQoNCnVzYSRwb3B1bGF0aW9uID0gdXNhX3dvcmxkX3BvcCRQb3B1bGF0aW9uDQp1c2EkcGVyY2VudGFnZSA9ICh1c2EkcGVvcGxlX3ZhY2NpbmF0ZWQvdXNhJHBvcHVsYXRpb24pKjEwMA0KDQoNCnBsb3RfdXNhIDwtIHVzYSAlPiUNCiAgZ2dwbG90KCBhZXMoeD1kYXRlLCB5PXBlb3BsZV92YWNjaW5hdGVkKSkgKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBnZW9tX2xpbmUoY29sb3I9IiM2OWIzYTIiKSArDQogICAgeGxhYigi8J+HuvCfh7giKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCksbGltaXRzID0gYygwLCAxMDAwMDAwMCkpKw0KICAgIHRoZW1lX3dzaigpDQogICAgDQpwbG90X3VzYV8xID0gcGxvdF91c2EgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9IiM5OTMzMzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NywgYW5nbGU9NDUpKQ0KcGxvdF91c2FfMSA9IHBsb3RfdXNhXzEgKyBnZ3RpdGxlKCJWYWNjaW5hdGlvbiBvbiBcbiBVU0EgKDIwMjEpIikgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfdXNhX3BlcmNlbnRhZ2UgPC0gdXNhICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWRhdGUsIHk9cGVyY2VudGFnZSkpICsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9saW5lKGNvbG9yPSIjNjliM2EyIikgKw0KICAgIHhsYWIoIvCfh7rwn4e4IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAsIDIpLGxpbWl0cyA9IGMoMCwgMjApKSsNCiAgICB0aGVtZV93c2ooKQ0KDQpwbG90X3VzYV8yID0gcGxvdF91c2FfcGVyY2VudGFnZSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGNvbG9yPSIjOTkzMzMzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTcsIGFuZ2xlPTQ1KSkNCnBsb3RfdXNhXzIgPSBwbG90X3VzYV8yICsgZ2d0aXRsZSgiVmFjY2luYXRpb24gb24gXG4gVVNBICgyMDIxKSIpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpDQoNCnBsb3RfdXNhX2ludGVyYWN0aXZlIDwtIHBsb3RfbHkoeCA9IHVzYSRkYXRlLCB5ID0gdXNhJHBlb3BsZV92YWNjaW5hdGVkLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RfdXNhX2ludGVyYWN0aXZlMiA8LSBwbG90X2x5KHggPSB1c2EkZGF0ZSwgeSA9IHVzYSRwZXJjZW50YWdlLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQpwbG90X3VzYV9pbnRlcmFjdGl2ZTMgPC0gcGxvdF9seSh4ID0gdXNhJGRhdGUsIHkgPSB1c2EkZGFpbHlfdmFjY2luYXRpb25zLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIGZpbGwgPSAidG96ZXJveSIpDQoNCnBsb3RseTo6c3VicGxvdChwbG90X3VzYV9pbnRlcmFjdGl2ZSxwbG90X3VzYV9pbnRlcmFjdGl2ZTIscGxvdF91c2FfaW50ZXJhY3RpdmUzLCBucm93cz0xKQ0KYGBgDQoNCiMjIFN1bW1hcml6aW5nIFBsb3RzDQoNCiMjIyBQZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gdmFjY2luYXRlZA0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCngxID0gZ3JpZC5hcnJhbmdlKHBsb3RfYXJnZW50aW5hXzIscGxvdF9hdXN0cmlhXzIscGxvdF9iYWhyYWluXzIscGxvdF9iZWxnaXVtXzIscGxvdF9idWxnYXJpYV8yLCBwbG90X2NoaWxlXzIsbnJvdz0yKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQp4MiA9IGdyaWQuYXJyYW5nZShwbG90X2NoaW5hXzIgLCBwbG90X2Nvc3RhX3JpY2FfMiwgcGxvdF9jcm9hdGlhXzIsIHBsb3RfY3plY2hfcmVwXzIsIHBsb3RfZGVubWFya18yLCBwbG90X2VzdG9uaWFfMixucm93PTIpDQpgYGANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCngzID0gZ3JpZC5hcnJhbmdlKHBsb3RfZmlubGFuZF8yICwgcGxvdF9mcmFuY2VfMiAsIHBsb3RfZ2VybWFueV8yLHBsb3RfZ2licmFsdGFyXzIgLCBwbG90X2dyZWVjZV8yLCBwbG90X2h1bmdhcnlfMiAsIG5yb3cgPSAyKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQp4NCA9IGdyaWQuYXJyYW5nZShwbG90X2ljZWxhbmRfMiAsIHBsb3RfaW5kaWFfMiAsIHBsb3RfaXJlbGFuZF8yLHBsb3RfaXNyYWVsXzIgLCBwbG90X2l0YWx5XzIsIHBsb3RfbGF0dmlhXzIgLCBucm93ID0gMikNCmBgYA0KDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KeDUgPSBncmlkLmFycmFuZ2UocGxvdF9saXRodWFuaWFfMiAsIHBsb3RfbHV4ZW1ib3VyZ18yICwgcGxvdF9tYWx0YV8yLHBsb3RfbWV4aWNvXzIgLCBwbG90X25vcndheV8yLCBwbG90X29tYW5fMiwgbnJvdyA9IDIpDQpgYGANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCng2ID0gZ3JpZC5hcnJhbmdlKHBsb3RfcG9sYW5kXzIgLCBwbG90X3BvcnR1Z2FsXzIgLCBwbG90X3JvbWFuaWFfMixwbG90X3NhdWRpX2FyYWJpYV8yLCBwbG90X3NlcmJpYV8yLCBwbG90X3NleWNoZWxsZXNfMSAsIG5yb3cgPSAyKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQp4NyA9IGdyaWQuYXJyYW5nZShwbG90X3Nsb3Zha2lhXzIgLCBwbG90X3Nsb3ZlbmlhXzIgLCBwbG90X3NwYWluXzIscGxvdF9zd2VkZW5fMiAsIHBsb3RfdHVya2V5XzIsIHBsb3RfdWFlXzIgLCBwbG90X3VrXzIgLCBwbG90X3VzYV8yLCBucm93ID0gMikNCmBgYA0KDQojIyBMZXNzIFZhY2NpbmF0ZWQgQ291bnRyeSBpbiB0ZXJtcyBvZiBQb3B1bGF0aW9uICglIG9mIFBvcHVsYXRpb24pDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KdmFjY2luYXRpb25zMSA9IHZhY2NpbmF0aW9ucw0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJBcmdlbnRpbmEiXSA8LSBtYXgoYXJnZW50aW5hJHBlcmNlbnRhZ2UgLCBuYS5ybSA9IFRSVUUpDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkF1c3RyaWEiXSA8LSBtYXgoYXVzdHJpYSRwZXJjZW50YWdlICwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiQmFocmFpbiJdIDwtIG1heChiYWhyYWluJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkJlbGdpdW0iXSA8LSBtYXgoYmVsZ2l1bSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkJyYXppbCJdIDwtIG1heChicmF6aWwkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiQnVsZ2FyaWEiXSA8LSBtYXgoYnVsZ2FyaWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiQ2FuYWRhIl0gPC0gbWF4KGNhbmFkYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJDaGlsZSJdIDwtIG1heChjaGlsZSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkNoaW5hIl0gPC0gbWF4KGNoaW5hJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkNvc3RhIFJpY2EiXSA8LSBtYXgoY29zdGFfcmljYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJDcm9hdGlhIl0gPC0gbWF4KGNyb2F0aWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiQ3lwcnVzIl0gPC0gbWF4KGN5cHJ1cyRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJDemVjaCJdIDwtIG1heChjemVjaF9yZXAkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiRGVubWFyayJdIDwtIG1heChkZW5tYXJrJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkVzdG9uaWEiXSA8LSBtYXgoZXN0b25pYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJGaW5sYW5kIl0gPC0gbWF4KGZpbmxhbmQkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiRnJhbmNlIl0gPC0gbWF4KGZyYW5jZSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJHZXJtYW55Il0gPC0gbWF4KGdlcm1hbnkkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiR2licmFsdGFyIl0gPC0gbWF4KGdpYnJhbHRhciRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJHcmVlY2UiXSA8LSBtYXgoZ3JlZWNlJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkh1bmdhcnkiXSA8LSBtYXgoaHVuZ2FyeSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJJY2VsYW5kIl0gPC0gbWF4KGljZWxhbmQkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiSW5kaWEiXSA8LSBtYXgoaW5kaWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiSW5kb25lc2lhIl0gPC0gbWF4KGluZG9uZXNpYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJJcmVsYW5kIl0gPC0gbWF4KGlyZWxhbmQkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiSXNyYWVsIl0gPC0gbWF4KGlzcmFlbCRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJJdGFseSJdIDwtIG1heChpdGFseSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJLdXdhaXQiXSA8LSBtYXgoa3V3YWl0JHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIkxhdHZpYSJdIDwtIG1heChsYXR2aWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiTGl0aHVhbmlhIl0gPC0gbWF4KGxpdGh1YW5pYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJMdXhlbWJvdXJnIl0gPC0gbWF4KGx1eGVtYm91cmckcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiTWFsdGEiXSA8LSBtYXgobWFsdGEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiTWV4aWNvIl0gPC0gbWF4KG1leGljbyRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJOb3J3YXkiXSA8LSBtYXgobm9yd2F5JHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIk9tYW4iXSA8LSBtYXgob21hbiRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJQYW5hbWEiXSA8LSBtYXgocGFuYW1hJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlBvbGFuZCJdIDwtIG1heChwb2xhbmQkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiUG9ydHVnYWwiXSA8LSBtYXgocG9ydHVnYWwkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiUm9tYW5pYSJdIDwtIG1heChyb21hbmlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlJ1c3NpYSJdIDwtIG1heChydXNzaWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJTYXVkaSBBcmFiaWEiXSA8LSBtYXgoc2F1ZGlfYXJhYmlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlNlcmJpYSJdIDwtIG1heChzZXJiaWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiU2V5Y2hlbGxlcyJdIDwtIG1heChzZXljaGVsbGVzJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlNsb3Zha2lhIl0gPC0gbWF4KHNsb3Zha2lhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlNsb3ZlbmlhIl0gPC0gbWF4KHNsb3ZlbmlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlNwYWluIl0gPC0gbWF4KHNwYWluJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlN3ZWRlbiJdIDwtIG1heChzd2VkZW4kcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCnZhY2NpbmF0aW9uczEkcGVyY2VudGFnZVt2YWNjaW5hdGlvbnMkY291bnRyeSA9PSAiVHVya2V5Il0gPC0gbWF4KHR1cmtleSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0KdmFjY2luYXRpb25zMSRwZXJjZW50YWdlW3ZhY2NpbmF0aW9ucyRjb3VudHJ5ID09ICJVQUUiXSA8LSBtYXgodWFlJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlVuaXRlZCBLaW5nZG9tIl0gPC0gbWF4KHVrJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQp2YWNjaW5hdGlvbnMxJHBlcmNlbnRhZ2VbdmFjY2luYXRpb25zJGNvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiXSA8LSBtYXgodXNhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkgDQpgYGANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnggPXNlbGVjdCh2YWNjaW5hdGlvbnMxLCBjb3VudHJ5LCBwZXJjZW50YWdlKQ0KDQp5ID0gdW5pcXVlKHgpICU+JSBkcm9wX25hDQoNCnlpbmNyID0geSAlPiUgYXJyYW5nZSh5JHBlcmNlbnRhZ2UpDQp5aW5jciA9IHlpbmNyWyFncmVwbCgiLUluZiIsIHlpbmNyJHBlcmNlbnRhZ2UpLF0NCg0KDQprYWJsZTEgPWhlYWQoeWluY3IsNykNCmthYmxlMSA9IGtibChrYWJsZTEpDQprYWJsZTENCmBgYA0KDQojIyBNb3N0IFZhY2NpbmF0ZWQgQ291bnRyeSBpbiB0ZXJtcyBvZiBQb3B1bGF0aW9uICglIG9mIFBvcHVsYXRpb24pDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KeWRlc2MgPSB5ICU+JSBhcnJhbmdlKHkkcGVyY2VudGFnZSAsZGVzY2VuZGluZz1UUlVFKQ0KDQprYWJsZTIgPXRhaWwoeWRlc2MsNykNCmthYmxlMiA9IGtibChrYWJsZTIpDQprYWJsZTINCmBgYA0KDQojIyBDb3VudHJ5IFBvcHVsYXRpb24gdmFjY2luYXRlZCBhdCBsZWFzdCBvbmNlIChpbiBNYXApDQoNCiMjIyMgSW5zdGFsbCBuZWNlc3NhcnkgcGFja2FnZXMNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dtYXAiKQ0KbGlicmFyeShnZ21hcCkNCmluc3RhbGwucGFja2FnZXMoIm1hcHMiKQ0KbGlicmFyeShtYXBzKQ0KaW5zdGFsbC5wYWNrYWdlcygibWFwZGF0YSIpDQpsaWJyYXJ5KG1hcGRhdGEpDQpgYGANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCndvcmxkIDwtIG1hcF9kYXRhKCJ3b3JsZCIpDQoNCndvcmxkJHBlcmNlbnRhZ2UgPSBOQQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkFyZ2VudGluYSJdIDwtIG1heChhcmdlbnRpbmEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJBdXN0cmlhIl0gPC0gbWF4KGF1c3RyaWEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJCYWhyYWluIl0gPC0gbWF4KGJhaHJhaW4kcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJCZWxnaXVtIl0gPC0gbWF4KGJlbGdpdW0kcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJCcmF6aWwiXSA8LSBtYXgoYnJhemlsJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJCdWxnYXJpYSJdIDwtIG1heChidWxnYXJpYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpIA0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkNhbmFkYSJdIDwtIG1heChjYW5hZGEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKSANCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJDaGlsZSJdIDwtIG1heChjaGlsZSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiQ2hpbmEiXSA8LSBtYXgoY2hpbmEkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkNvc3RhIFJpY2EiXSA8LSBtYXgoY29zdGFfcmljYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiQ3JvYXRpYSJdIDwtIG1heChjcm9hdGlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJDeXBydXMiXSA8LSBtYXgoY3lwcnVzJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJEZW5tYXJrIl0gPC0gbWF4KGRlbm1hcmskcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkVzdG9uaWEiXSA8LSBtYXgoZXN0b25pYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiRmlubGFuZCJdIDwtIG1heChmaW5sYW5kJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJGcmFuY2UiXSA8LSBtYXgoZnJhbmNlJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJHZXJtYW55Il0gPC0gbWF4KGdlcm1hbnkkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkdpYnJhbHRhciJdIDwtIG1heChnaWJyYWx0YXIkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkdyZWVjZSJdIDwtIG1heChncmVlY2UkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIkh1bmdhcnkiXSA8LSBtYXgoaHVuZ2FyeSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiSWNlbGFuZCJdIDwtIG1heChpY2VsYW5kJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJJbmRpYSJdIDwtIG1heChpbmRpYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiSW5kb25lc2lhIl0gPC0gbWF4KGluZG9uZXNpYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiSXJlbGFuZCJdIDwtIG1heChpcmVsYW5kJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJJc3JhZWwiXSA8LSBtYXgoaXNyYWVsJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJJdGFseSJdIDwtIG1heChpdGFseSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiS3V3YWl0Il0gPC0gbWF4KGt1d2FpdCRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiTGF0dmlhIl0gPC0gbWF4KGxhdHZpYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiTGl0aHVhbmlhIl0gPC0gbWF4KGxpdGh1YW5pYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiTHV4ZW1ib3VyZyJdIDwtIG1heChsdXhlbWJvdXJnJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJNYWx0YSJdIDwtIG1heChtYWx0YSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiTWV4aWNvIl0gPC0gbWF4KG1leGljbyRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiTm9yd2F5Il0gPC0gbWF4KG5vcndheSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiT21hbiJdIDwtIG1heChvbWFuJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJQYW5hbWEiXSA8LSBtYXgocGFuYW1hJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJQb2xhbmQiXSA8LSBtYXgocG9sYW5kJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJQb3J0dWdhbCJdIDwtIG1heChwb3J0dWdhbCRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiUm9tYW5pYSJdIDwtIG1heChyb21hbmlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJSdXNzaWEiXSA8LSBtYXgocnVzc2lhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJTYXVkaSBBcmFiaWEiXSA8LSBtYXgoc2F1ZGlfYXJhYmlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJTZXJiaWEiXSA8LSBtYXgoc2VyYmlhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJTZXljaGVsbGVzIl0gPC0gbWF4KHNleWNoZWxsZXMkcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIlNsb3Zha2lhIl0gPC0gbWF4KHNsb3Zha2lhJHBlcmNlbnRhZ2UsIG5hLnJtID0gVFJVRSkNCndvcmxkJHBlcmNlbnRhZ2Vbd29ybGQkcmVnaW9uID09ICJTbG92ZW5pYSJdIDwtIG1heChzbG92ZW5pYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiU3BhaW4iXSA8LSBtYXgoc3BhaW4kcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIlN3ZWRlbiJdIDwtIG1heChzd2VkZW4kcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0Kd29ybGQkcGVyY2VudGFnZVt3b3JsZCRyZWdpb24gPT0gIlVuaXRlZCBBcmFiIEVtaXJhdGVzIl0gPC0gbWF4KHVhZSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiVVNBIl0gPC0gbWF4KHVzYSRwZXJjZW50YWdlLCBuYS5ybSA9IFRSVUUpDQp3b3JsZCRwZXJjZW50YWdlW3dvcmxkJHJlZ2lvbiA9PSAiVUsiXSA8LSBtYXgodWskcGVyY2VudGFnZSwgbmEucm0gPSBUUlVFKQ0KDQpjYV9iYXNlID0gZ2dwbG90KGRhdGEgPSB3b3JsZCwgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywgeSA9IGxhdCAsIGdyb3VwID0gZ3JvdXApKSArIA0KICBjb29yZF9maXhlZCgxLjMpDQpgYGANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmVsYm93X3Jvb20xID0gY2FfYmFzZSArIA0KICAgICAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB3b3JsZCwgYWVzKGZpbGwgPSBwZXJjZW50YWdlKSwgY29sb3IgPSAiYmxhY2siKSArDQogICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEpICsNCiAgICAgIHRoZW1lX2J3KCkNCg0KZWxib3dfcm9vbTEgKyBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJsaWdodCBibHVlIiwgaGlnaCA9ICJkYXJrIGJsdWUiLCBuYS52YWx1ZSA9IE5BKQ0KYGBgDQoNCg==